我试图延迟对文本框的操作。我想搜索一个单词的大量文本。现在我使用" textchanged"事件。这里的问题是,当他达到一个超过3个字母的单词时(我已经阻止了0-2个单词搜索),这个过程变得密集。
问题: 这有什么可能性?
代码:
private void txtSearch_TextChanged(object sender, EventArgs e)
{
// delay here
dosearch(searchbox.text);
}
答案 0 :(得分:8)
(重新)每按一次键启动一个调度程序计时器,并在计时器结束时进行搜索。大约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线程上运行),您可以在单独的任务中执行搜索。搜索完成后,您需要确保结果不是陈旧的(用户在搜索时没有修改搜索文本):
private void Search(string searchText)
{
Task.Run(() =>
{
// Execute search
Dispatcher.Invoke(() =>
{
if (searchText == searchBox.Text)
{
// Result is good
}
});
});
}