【问题标题】:Delaying the search function in keypress actions延迟按键操作中的搜索功能
【发布时间】:2014-08-25 12:28:54
【问题描述】:

我正在尝试延迟对文本框的操作。我想在大量文本中搜索一个单词。现在我用“textchanged”事件来做这件事。这里的问题是,当他遇到一个超过 3 个字母的单词(我已经阻止了 0-2 个单词搜索)时,这个过程变得很密集。

问题: 我在这里有什么可能性?

  • 例如:在 textchanged-event 上设置一个计时器?如果是这样,我该怎么做?

代码:

private void txtSearch_TextChanged(object sender, EventArgs e)
{
 // delay here
 dosearch(searchbox.text);
}

【问题讨论】:

  • 这是 WPF 还是 Silverlight?

标签: c# search timer delay


【解决方案1】:

(重新)在每次按下键时启动调度程序计时器,并在计时器结束时进行搜索。大约 200-300 毫秒的延迟通常是相当不错的。

private DispatcherTimer _searchTimer;

// Initialize timer in constructor with 200 ms delay and register tick event.

private void txtSearch_TextChanged(object sender, EventArgs e)
{
    _searchTimer.Stop();
    _searchTimer.Start();
}

private void OnSearchTimerTick(object sender, EventArgs e)
{
    _searchTimer.Stop()
    Search(searchBox.Text);
}

private void Search(string searchTxt)
{
    // Do search
}

更新: 为了提高响应性(上面的示例将在搜索时锁定 UI,因为调度程序计时器回调在 UI 线程上运行),您可以在单独的 Task 中执行搜索。搜索完成后,您需要确保结果不会过时(即用户在搜索时没有修改搜索文本):

private void Search(string searchText)
{
    Task.Run(() =>
        {
            // Execute search

            Dispatcher.Invoke(() =>
            {
                if (searchText == searchBox.Text)
                {
                    // Result is good
                }
            });
    });
}

【讨论】:

  • 200ms 延迟意味着用户每分钟输入 300 个字符。不是每个用户的打字速度都这么快。我会说至少让它500毫秒。否则 +1
  • 没错,这是允许慢速打字机和保持快速响应之间的平衡。
  • 很好,刚刚实现了这个解决方案,我必须说:我是一个快速打字员,这对我来说也很好。
  • 为什么只有在搜索文本没有改变的情况下才执行搜索?
  • @sinsedrix 想象用户正在输入一张纸。他可能需要查看论文,花费的时间超过 300-500 毫秒。此时搜索将开始,即使用户实际上并没有完成输入。当搜索返回时,用户同时键入了剩余的文本,并启动了第二次搜索。现在我们有两个同时运行的搜索查询,我们需要确保只使用与最终搜索字符串匹配的结果。
猜你喜欢
  • 2014-12-28
  • 1970-01-01
  • 2020-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 2017-07-18
  • 1970-01-01
相关资源
最近更新 更多