【问题标题】:real-time search in textbox文本框中的实时搜索
【发布时间】:2015-01-29 03:56:54
【问题描述】:

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

现在我正在重新使用同一个旧线程(并且只有在线程完成/取消时才等待进行新的搜索)。

如果每次我想进行搜索时都可以创建一个新线程,那我会容易得多 - 因为这样我就不需要在搜索之前等待另一个线程完成。

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

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

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

【问题讨论】:

  • 使用Task 类。它使用线程池,这将避免创建新线程的大部分开销。
  • The search occurs every time the text is changed,这是一个真正的性能打击,你可以添加一个计时器,比如 1000 毫秒来滴答,在每次击键时重置计时器,只有在用户停止输入后(经过 1000 毫秒直到计时器滴答声)您进行搜索。
  • 你真的必须使用后台线程吗?搜索操作需要多长时间?每次搜索都打一个后台线程会导致性能下降。

标签: c# .net multithreading winforms overhead


【解决方案1】:

您要查找的内容称为Thread Pool

从某种意义上说,它与您正在做的事情基本相同,即它重用了一个线程。除了有很多线程并且重用对调用者隐藏。更多解释here.

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

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

【讨论】:

    【解决方案2】:

    我有一些建议:

    1. 如果你有一个自然的异步搜索系统(例如实体框架异步 API),使用Task,如果没有使用ThreadPool

    2. 在您的textbox.TextChanged 事件中启动一个计时器并在每次文本更改时重置它,如果计时器达到它结束(1 秒)然后尝试搜索,这种方法避免搜索 aababc,当您快速输入abc 并打算搜索abc

    3. 为每个搜索线程附加一个时间戳,当结果准备好时将其保存在 UI 中的某个位置,如果线程的结果已准备好并且当前结果时间戳大于准备好的时间戳,则忽略结果。

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多