何时以及为何将 CancellationToken 传递给 TaskCompletionSource.SetCanceled?

K 1*_*K 1 3 .net c# task cancellation-token

不明白这个CancellationToken参数是干什么用的?

通过CancellationToken或不通过并没有什么区别。

public async void test()
{
    var cts = new CancellationTokenSource();
    var tcs = new TaskCompletionSource();
    tcs.SetCanceled(cts.Token);

    try
    {
        await tcs.Task;
    }
    catch (TaskCanceledException e)
    {
        Console.WriteLine($"{e.Message}");
    }
}
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 5

正如ProgrammingLlama 所建议的,该参数设置观察任务结果时引发的异常的属性CancellationToken因此捕获的异常test将将该属性设置为传入的取消标记。

我相信该CancellationToken属性是为了能够区分不同的取消来源;但是,由于链接的取消标记,此属性在一般情况下没有用处。

旁注:

  • 避免async void
  • 请务必处置或取消您的CancellationTokenSources。
  • 使用await而不是ContinueWith.