2014-12-01 6 views
1

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

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

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

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

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

Это беспроигрышная форма проекта в C# 4.0

+3

Используйте класс 'Task'. Он использует пул потоков, который позволит избежать значительной части накладных расходов при создании нового потока. –

+0

'Поиск происходит каждый раз, когда текст изменяется ', это реальный удар по производительности, вы можете добавить таймер, скажем, 1000 мс, чтобы пометить, сбросить таймер при каждом нажатии клавиши, только после того, как пользователь перестанет печатать (в течение 1000 мс пока таймер не покажет), что вы выполняете поиск. – kennyzx

+0

Должен ли ты действительно использовать фоновый поток? Сколько времени занимает операция поиска? Нажатие фонового потока для каждого поиска приведет к поражению производительности. –

ответ

0

Что вы ищете называется Thread Pool.

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

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

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

0

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

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

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

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