簡體   English   中英

我應該使用CancellationTokenSource還是CancellationToken取消.NET中的任務

[英]Should I use CancellationTokenSource or CancellationToken to Cancel a task in .NET

我看到CancellationTokenCancellationTokenSource都具有IsCancellationRequested getter方法。 大多數示例將CancellationToken傳遞給Task內部執行的方法。 在我看來,使用這些方法中的任何一個,調用都可以返回。 如果我使用CancellationTokenSource IsCancellationRequested ,是否會出現問題? 什么時候我應該引發異常(通過使用ThrowIfCancellationRequested ),或者如果有取消請求,則從該方法返回,如以下代碼所示?

class Program
{
    //If CancellationToken is passed then it behaves in same way?
    public static int TaskMethod(CancellationTokenSource tokenSource)
    {
        int tick = 0;
        while (!tokenSource.IsCancellationRequested)
        {
            Console.Write('*');
            Thread.Sleep(500);
            tick++;
            //token.Token.ThrowIfCancellationRequested();
        }
        //Should I just return or use ThrowIfCancellationRequested?
        return tick;
    }

    public static void Main()
    {
        CancellationTokenSource tokenSource = new CancellationTokenSource();
        CancellationToken token = tokenSource.Token;
        Task<int> task = Task.Factory.StartNew<int>(() => TaskMethod(tokenSource));
        Console.WriteLine("Press enter to stop the task");
        Console.ReadLine();
        tokenSource.Cancel();
        Console.WriteLine("{0}", task.Result);
    }
}
  1. CancellationTokenSource保存並控制CancellationToken實例。 預計task方法將使用取消令牌,但不能對其進行修改。 如果將CancellationTokenSource傳遞給方法,則該方法將完全控制取消令牌。 因此,該方法應將CancellationToken作為參數。

  2. 取消請求后該方法的行為由您決定。 如果任務已由取消令牌終止,則沒有規則規定該任務應處於取消狀態(拋出TaskCanceledException )。

在我看來, CancellationTokenSource用於啟動取消(例如,通過另一個/父線程)。 CancellationToken.Token是關聯的CancellationToken ,您將傳遞給諸如MSDN所說的 TaskFactory.StartNew()之類的東西:

CancellationTokenSource.IsCancellationRequested屬性指示是否已為此令牌源請求取消,例如由於調用了它的Cancel方法。

然后, Task將監視CancellationToken.IsCancellationRequested以確定何時關閉。

對於屬性CancellationToken.IsCancellationRequested MSDN說

獲取是否已請求取消此令牌。

綜上所述,我想告訴我們CancellationTokenSource.IsCancellationRequested用於將CancellationTokenTaskFactory.StartNew()關聯。 CancellationToken.IsCancellationRequested用於定義是否已為此令牌請求取消。 此外, IntelliSenseCancellationTokenSource.Token.IsCancellationRequestedCancellationToken.IsCancellationRequested具有相同的定義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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