我有一个文本框,用户在其中键入搜索字符串,然后程序在后台工作线程上搜索该字符串。
现在我正在重新使用相同的旧线程(等待线程完成/取消后再进行新搜索)。
如果我每次想要进行搜索时都能创建一个新线程,那将会更容易 - 因为在进行搜索之前我不需要等待其他线程完成。
每次更改文本时都会进行搜索(事件textbox.TextChanged) - 这意味着很多新的和处理好的线程......
这是一个可行的策略还是我应该继续重复使用相同的线程(为很多潜在的错误腾出空间)?
这是C#4.0中的win-form项目
答案 0 :(得分:0)
您要找的是Thread Pool。
在某种意义上它与重用线程基本相同。除了有很多线程,并且重用被隐藏在调用者之外。更多解释here。
此外,Peter建议使用Task
与使用Thread Pool
类似,因为默认情况下,任务会在Thread Pool
上运行。
并且不要忘记,您仍然必须解决同时运行多个搜索的问题,并且它们可能无法完成以便它们已启动,也无法获得当前搜索的有效数据。最好是在开始新搜索之前“取消”当前搜索。
答案 1 :(得分:0)
我有一些建议:
如果您有自然异步搜索系统(例如Entity Framework async API),请使用Task
,如果不使用ThreadPool
。
在textbox.TextChanged
事件中启动计时器并在每次文本更改时重置计时器,如果计时器到达结束时(1秒)然后尝试搜索,则此方法会避免搜索a
当您快速键入ab
并且意图搜索abc
abc
和abc
将时间戳附加到每个搜索线程,当结果准备就绪时将其保存在UI中的某个位置,如果线程的结果已准备好且当前结果时间戳大于准备好的那个,则忽略结果。< / p>