2014-07-11 66 views
1

我正在學習如何取消使用取消令牌的任務。 在這裏,我已經爲它寫了一個UnitTest,但我沒有得到它的工作方式。取消令牌的使用

[TestMethod] 
public async Task Task_should_not_run_when_token_cancelled_before_its_call() 
{ 
    var cts = new CancellationTokenSource(); 
    var token = cts.Token; 

    cts.Cancel(); 

    Debug.WriteLine("Calling Cancellable Method".ToUpper()); 
    try 
    { 
     await CheckMeCalled(token); 
    } 
    catch (Exception expException) 
    { 

    } 
} 

private async Task CheckMeCalled(CancellationToken ct) 
{ 
    Debug.WriteLine("Before task delayed".ToUpper()); 
    await Task.Delay(5000); 
    Debug.WriteLine("After task delayed".ToUpper()); 
} 

在上述測試I調用CheckMeCalled方法之前調用的cts.Cancel()。所以它不應該隨着取消而運行。但它正在全面運行。

我看過的地方,

If Task is not running and you cancel it then it will not go to a running state instead it go for canceled state when you call it

但似乎並沒有在這裏發生。 有人可以解釋給我嗎?任何幫助表示讚賞。歡呼聲:)

回答

5

您添加的報價是有關通過Task.RunTask.Factory.Startnew創建一個新Task。當路過一個CancellationToken到你的方法,你必須運行

private async Task CheckMeCalled(CancellationToken ct) 
{ 
    ct.ThrowIfCancellationRequested(); 
    Debug.WriteLine("Before task delayed".ToUpper()); 
    await Task.Delay(5000, ct); 
    Debug.WriteLine("After task delayed".ToUpper()); 
} 

下面是關於消除報價由斯蒂芬Toub令牌和Task前主動檢查令牌:如果令牌已取消要求

在任務開始執行之前,任務將不會執行。它將立即過渡到已取消,而不是轉換到正在運行。這樣可以避免運行該任務的成本,如果該任務在運行時會被取消。

我也建議你閱讀NET 4 Cancellation Framework由PFX團隊的取消機制的廣泛審查

1

您必須手動檢查令牌以查看是否請求了取消。

有了:

ct.IsCancellationRequested