1

我有這個代碼主題:取消令牌如何停止繼續?

foreach (string file in allDirectoriesFiles) 
{ 
    if (cancellationToken.IsCancellationRequested) 
    { 
     return; 
    } 

    // ... some operation... 
} 

// ... some operation 2... 

通知我使用return,而不是break,因爲如果我停止線程的some operation 2不能執行。

我還注意到,在這種方式下.ContinueWith它沒有執行。

那麼,但這只是一個「返回」功能。由於tokenSource.Cancel()而不是通常的返回,C#如何知道我正在返回?

回答

3

您不應使用相同的取消標記創建延續,否則延續也將被取消,即使在執行之前也是如此。如果您始終希望執行取消操作,請使用不同的取消標記(來自不同的取消來源)創建延續,或者直接創建它,而不使用取消標記。

+0

好吧!所以:如果當前線程被執行,我只能停止檢查它內部的取消標記(實際上它不會強制線程退出,換句話說:如果我沒有檢查,它會一直持續到結束如果繼續函數沒有啓動,那麼調用取消標記就不會(如果沒有我手動檢查),對嗎? – markzzz 2013-04-21 12:54:29

+0

是的,這是正確的,即使是'正常'任務也不會被執行,如果取消令牌(創建它)在任務被任務調度程序處理之前被取消,你只能在你自己的任務中檢查這個標記,這樣你可以取消一個長時間運行的循環,等等。O和一個註釋:結束一個任務並不一定意味着線程(即運行的線程)退出,即使拋出異常也是如此。 – 2013-04-21 13:09:30

1

A CancellationToken意在一次性地將取消傳播到整套動作。一旦你的源碼爲Cancel(),其他的延續將不會被調用。