簡體   English   中英

CancellationTokenSource是否會突然取消?

[英]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.

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