通常這是用定時器完成的。當搜索文本改變時,你開始(或重新使用)一個定時器,它將在延遲後觸發並執行搜索請求。如果在延遲期間輸入更多文本 - 定時器將被重置。示例代碼:
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