[英]Does a CancellationTokenSource cancel abruptly?
可以說我有這樣的事情:
private CancellationTokenSource myToken;
public void MyMyMethod()
{
myToken = new CancellationTokenSource();
var task = Task.Factory.StartNew(() => DoIt(myToken.Token), myToken.Token);
Thread.Sleep(100);
myToken.Cancel();
}
public void MyOtherMethod()
{
myToken.Cancel();
}
private void DoIt(CancellationToken token)
{
token.ThrowIfCancellationRequested();
try
{
for (int i = 0; i < 1000000; i++)
{
Console.WriteLine(i);
}
}
catch (Exception ex)
{
string s = "";
}
}
如果我調用myToken.Cancel,它將突然停止DoIt方法中的任務,還是我必須將令牌傳遞給DoIt並調用myToken.ThrowIfCancellationRequested()
以便在調用Cancel時將引發異常並突然停止?
如果不將令牌傳遞給task方法,是否可以這樣做?
還是我必須監視DoIt方法中的token.IsCancellationRequested?
通過從此處閱讀http://social.msdn.microsoft.com/Forums/da-DK/parallelextensions/thread/9f88132a-f8bd-4885-ab63-645d7b6c2127 ,似乎令牌用於取消任務之前的任務“真的”開始了,但是已經排隊了。
這是取消計划執行但尚未開始的任務的一種方法。 任務運行后,取消任務的唯一方法是通過您自己在方法中的檢查來協作。 沒有這個,您將必須始終啟動任務,然后在內部對其進行檢查,這將增加很多額外的不必要的開銷
您甚至可以從Task構造函數中的Cancellation令牌中讀取它:為什么?
我必須將令牌傳遞給DoIt並調用myToken.ThrowIfCancellationRequested()
是的你是。 TPL取消是協作的,這意味着您的線程函數必須定期檢查是否已請求取消,如果已請求,則終止自身。
另一種選擇是調用Thread.Abort()
,這通常不是一個好主意。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.