[英]async/await continuing too soon
所以我基本上試圖將過濾器進程的調用延遲 1.5 秒,以允許用戶鍵入多個擊鍵以防萬一。 如果鍵入了新的擊鍵,則取消先前等待的任務並開始等待新的任務:
System.Threading.CancellationTokenSource token = new System.Threading.CancellationTokenSource();
private async void MyTextBox_TextChanged(object sender, TextChangedEventArgs e)
{
token.Cancel();
await System.Threading.Tasks.Task.Delay(1500, token.Token);
this.filterText = (sender as TextBox).Text;
(this.Resources["CVS"] as CollectionViewSource).View.Refresh();
//Earlier I had tried this variant too:
//System.Threading.Tasks.Task.Delay(500, token.Token).ContinueWith(_ =>
//{
// this.filterText = (sender as TextBox).Text;
// (this.Resources["CVS"] as CollectionViewSource).View.Refresh();
//});
}
但是過濾過程( View.Refresh()
行)在第一次擊鍵時立即命中,無需等待。 我的印象是,在令牌上調用Cancel
會殺死Delay()
並因此也終止繼續任務,然后再種植下一個,但顯然這種方案不起作用。
我錯過了什么?
如果這對任何人都有幫助,那么以下內容對我來說是正確的。 我的錯誤是我錯誤地認為 CancellationTokenSource 是一個信號設備並且可以多次使用。 顯然情況並非如此:
private System.Threading.CancellationTokenSource cts = new System.Threading.CancellationTokenSource();
private async void TenantsFilter_TextChanged(object sender, TextChangedEventArgs e)
{
cts.Cancel();
cts = new System.Threading.CancellationTokenSource();
try
{
await System.Threading.Tasks.Task.Delay(1500, cts.Token);
this.filterText = (sender as TextBox).Text;
(this.Resources["CVS"] as CollectionViewSource).View.Refresh();
}
catch(System.Threading.Tasks.TaskCanceledException ee)
{
}
}
把它貼在這里是為了我自己的記錄,只是為了讓別人檢查我仍然沒有做錯任何事。
只是我們討論的一個片段
using System.Threading;
using System.Threading.Tasks;
private CancellationTokenSource cts = new CancellationTokenSource();
private Task delayTask;
private async void TenantsFilter_TextChanged(object sender, TextChangedEventArgs e)
{
cts.Cancel();
if (delayTask != null) {
delayTask.Wait();
}
cts = new CancellationTokenSource();
try
{
delayTask = Task.Delay(1500, cts.Token);
await delayTask;
this.filterText = (sender as TextBox).Text;
(this.Resources["CVS"] as CollectionViewSource).View.Refresh();
}
catch(TaskCanceledException)
{
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.