поиск в реальном времени в текстовом поле

1

У меня есть текстовое поле, в котором пользователь вводит строку поиска, а затем программа выполняет поиск этой строки в фоновом режиме.

Прямо сейчас я повторно использую тот же старый поток (и жду, чтобы сделать новый поиск, только когда поток закончен/отменен).

Мне было бы намного проще, если бы я мог просто создать новый поток каждый раз, когда захочу сделать поиск, потому что тогда мне не нужно ждать, пока другой поток будет выполнен до начала поиска.

Поиск происходит каждый раз, когда текст изменяется (event textbox.TextChanged) - так что это означает много новых и удаленных потоков...

Является ли это жизнеспособной стратегией или я должен продолжать повторное использование одного и того же потока (устраивает много потенциальных ошибок)?

Это проект win-form в С# 4.0

  • 3
    Используйте класс Task . Он использует пул потоков, что позволит избежать значительных накладных расходов при создании нового потока.
  • 0
    The search occurs every time the text is changed , это реальное снижение производительности, вы можете добавить таймер, скажем, 1000 мс, чтобы поставить галочку, сбросить таймер при каждом нажатии клавиши, только после того, как пользователь прекратит печатать (прошло 1000 мс до таймера галочки) что вы делаете поиск.
Показать ещё 1 комментарий
Теги:
multithreading
winforms
overhead

2 ответа

0

У меня есть некоторые предложения:

  1. Используйте Task если у вас есть естественная асинхронная поисковая система (например, API сущности Entity Framework async), если не использовать ThreadPool.

  2. Запустите таймер в вашем textbox.TextChanged событие и сбросьте его каждый раз, когда текст изменится, если таймер достигнет конца (1 с), затем попробуйте выполнить поиск, это позволяет избежать поиска a, ab и abc при быстром abc и предназначении искать abc

  3. прикрепите timestap к каждой строке поиска, и когда результат будет готов, сохраните его где-нибудь в вашем пользовательском интерфейсе, если результат потока будет готов, а текущий результат timestamp больше, чем тот, который готов, а затем проигнорируйте результат.

0

То, что вы ищете, называется пулом потоков.

Это в основном то же самое, что вы делаете в том смысле, что оно повторно использует поток. За исключением того, что существует много потоков, и повторное использование скрыто от invoker. Больше объяснений здесь.

Кроме того, предложение Peter использовать Task аналогично использованию Thread Pool, потому что задачи запускаются по Thread Pool по умолчанию.

И не забывайте, что вам по-прежнему приходится решать проблему одновременного запуска нескольких поисковых запросов, и что они могут не закончиться, чтобы они были запущены, и не могут иметь действительные данные для текущего поиска. Было бы лучше, если бы вы могли "отменить" текущий поиск, прежде чем начинать новый.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню