通常这是用定时器完成的。当搜索文本改变时,你开始(或重新使用)一个定时器,它将在延迟后触发并执行搜索请求。如果在延迟期间输入更多文本 - 定时器将被重置。示例代码:
public class MyClass {
private readonly Timer _timer;
const int ThrottlePeriod = 500; // ms
public MyClass() {
_timer = new System.Threading.Timer(_ => {
ExecuteRequest();
}, null, Timeout.Infinite, Timeout.Infinite);
}
private string _searchTerm;
public string SearchTerm
{
get { return _searchTerm; }
set
{
_searchTerm = value;
ResetTimer();
}
}
private void ResetTimer() {
_timer.Change(ThrottlePeriod, Timeout.Infinite);
}
private void ExecuteRequest() {
Console.WriteLine(SearchTerm);
}
}
如果计时器不可用,你可以做同样的Task.Delay:实现这个
public class MyClass
{
const int ThrottlePeriod = 500; // ms
private string _searchTerm;
public string SearchTerm
{
get { return _searchTerm; }
set
{
_searchTerm = value;
SearchWithDelay();
}
}
private async void SearchWithDelay() {
var before = this.SearchTerm;
await Task.Delay(ThrottlePeriod);
if (before == this.SearchTerm) {
// did not change while we were waiting
ExecuteRequest();
}
}
private void ExecuteRequest()
{
Console.WriteLine(SearchTerm);
}
}
来源
2016-05-06 12:02:30
Evk
为什么定时器感觉并不好? – Evk
@Evk一个计时器的实现对我来说有点不好意思。这是一个有趣的话题,因为我需要这个工作在一个不包含定时器实现的可移植类库中。我会更新我的问题以反映这一点。 –
并且Task.Delay至少可用? – Evk