文本框中的实时搜索

时间:2014-12-01 07:16:37

标签: c# .net multithreading winforms overhead

我有一个文本框,用户在其中键入搜索字符串,然后程序在后台工作线程上搜索该字符串。

现在我正在重新使用相同的旧线程(等待线程完成/取消后再进行新搜索)。

如果我每次想要进行搜索时都能创建一个新线程,那将会更容易 - 因为在进行搜索之前我不需要等待其他线程完成。

每次更改文本时都会进行搜索(事件textbox.TextChanged) - 这意味着很多新的和处理好的线程......

这是一个可行的策略还是我应该继续重复使用相同的线程(为很多潜在的错误腾出空间)?

这是C#4.0中的win-form项目

2 个答案:

答案 0 :(得分:0)

您要找的是Thread Pool

在某种意义上它与重用线程基本相同。除了有很多线程,并且重用被隐藏在调用者之外。更多解释here

此外,Peter建议使用Task与使用Thread Pool类似,因为默认情况下,任务会在Thread Pool上运行。

并且不要忘记,您仍然必须解决同时运行多个搜索的问题,并且它们可能无法完成以便它们已启动,也无法获得当前搜索的有效数据。最好是在开始新搜索之前“取消”当前搜索。

答案 1 :(得分:0)

我有一些建议:

  1. 如果您有自然异步搜索系统(例如Entity Framework async API),请使用Task,如果不使用ThreadPool

  2. textbox.TextChanged事件中启动计时器并在每次文本更改时重置计时器,如果计时器到达结束时(1秒)然后尝试搜索,则此方法会避免搜索a当您快速键入ab并且意图搜索abc

  3. 时,abcabc
  4. 将时间戳附加到每个搜索线程,当结果准备就绪时将其保存在UI中的某个位置,如果线程的结果已准备好且当前结果时间戳大于准备好的那个,则忽略结果。< / p>