首页 > 解决方案 > Async Task.Delay CancellationToken

问题描述

我正在寻找一种方法来延迟 TextChanged 事件中一些昂贵的搜索。以下代码在用户完成输入后等待 300 毫秒,然后进行搜索。

    Task.Delay(TimeSpan.FromMilliseconds(300), this.throttleCts.Token) // if no keystroke occurs, carry on after 500ms
            .ContinueWith(
                delegate { PerformSearch(e.NewText); }, 
                CancellationToken.None,
                TaskContinuationOptions.OnlyOnRanToCompletion,
                TaskScheduler.FromCurrentSynchronizationContext());

上面的示例是否有更优雅的等效异步/等待代码?

我用这个替换了,但它抛出了 TaskCanceledException

    await Task.Delay(300, this.throttleCts.Token);
    PerformSearch(e.NewText);

标签: c#.netasync-awaitcancellationtokensource

解决方案


使用 async-await 的标准方法是捕获OperationCanceledException.

private async void TextBox_TextChanged(object sender, TextChangedEventArgs e)
{
    try
    {
        await Task.Delay(300, this.throttleCts.Token);
    }
    catch (OperationCanceledException)
    {
        return;
    }
    PerformSearch(e.NewText);
}

推荐阅读