![](/img/trans.png)
[英]CancellationToken and CancellationTokenSource-How to use it?
[英]Should I use CancellationTokenSource or CancellationToken to Cancel a task in .NET
我看到CancellationToken
和CancellationTokenSource
都具有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);
}
}
CancellationTokenSource
保存並控制CancellationToken
實例。 預計task方法將使用取消令牌,但不能對其進行修改。 如果將CancellationTokenSource
傳遞給方法,則該方法將完全控制取消令牌。 因此,該方法應將CancellationToken
作為參數。
取消請求后該方法的行為由您決定。 如果任務已由取消令牌終止,則沒有規則規定該任務應處於取消狀態(拋出TaskCanceledException
)。
在我看來, CancellationTokenSource
用於啟動取消(例如,通過另一個/父線程)。 CancellationToken.Token
是關聯的CancellationToken
,您將傳遞給諸如MSDN所說的 TaskFactory.StartNew()之類的東西:
CancellationTokenSource.IsCancellationRequested
屬性指示是否已為此令牌源請求取消,例如由於調用了它的Cancel方法。
然后, Task
將監視CancellationToken.IsCancellationRequested
以確定何時關閉。
對於屬性CancellationToken.IsCancellationRequested
MSDN說 :
獲取是否已請求取消此令牌。
綜上所述,我想告訴我們CancellationTokenSource.IsCancellationRequested
用於將CancellationToken
與TaskFactory.StartNew()
關聯。 CancellationToken.IsCancellationRequested
用於定義是否已為此令牌請求取消。 此外, IntelliSense
對CancellationTokenSource.Token.IsCancellationRequested
和CancellationToken.IsCancellationRequested
具有相同的定義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.