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

问题描述 投票:0回答:1

我不明白

CancellationToken
参数是做什么用的?

通过或不通过

CancellationToken
没有任何区别。

public static async void test()
{
    var cts = new CancellationTokenSource();
    try
    {
        await f1(cts.Token);
    }
    catch (Exception e)
    {
        Console.WriteLine($"f1 {e.Message}");
    }
}

private static Task f1(CancellationToken token)
{
    TaskCompletionSource tcs = new TaskCompletionSource();

    Task.Delay(1000).ContinueWith((t) =>
    {
        tcs.SetCanceled(token);
    }, token);

    return tcs.Task;
}
c# .net task cancellation-token
1个回答
0
投票

正如 PlanningLlama 所建议的,该参数在观察任务结果时引发的异常上设置

CancellationToken
属性。因此
test
捕获的异常将将该属性设置为传入的取消标记。

我相信

CancellationToken
属性是为了区分不同的取消来源;但是,由于链接的取消令牌,此属性在一般情况下没有用。

旁注:

  • 避免
    async void
  • 请务必处置或取消您的
    CancellationTokenSource
  • 使用
    await
    代替
    ContinueWith
© www.soinside.com 2019 - 2024. All rights reserved.