簡體   English   中英

異步/等待太快繼續

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM