【发布时间】:2022-01-27 16:22:14
【问题描述】:
所以我基本上试图将过滤器进程的调用延迟 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() 并因此也终止继续任务,然后再种植下一个,但显然这个方案不起作用。
我错过了什么?
【问题讨论】:
-
您取消了用于取消延迟的令牌。所以没有发生延迟。
-
是的,但是令牌是一次性的吗?如果没有,请查看我在取消前一个任务后开始新任务。
-
取消后,你有一个取消的Token。您需要一个新的 CancellationTokenSource。
-
您的 ContinueWith 不使用令牌,因此对其没有影响。使用实际使用令牌的 ContinueWith 重载。
-
token.Tokentoken 不是令牌,而是CancellationTokenSource。使用正确的命名,因此很清楚它是什么以及它的作用。请注意,CancellationTokenSource是否有Reset()或UnCancel()方法?不,你需要一个新的。编辑:我只看到it has aTryReset。不过,这可能不是最好的用例。
标签: c# async-await task-parallel-library