2012-08-14 37 views
3

說我創建任務CancellationTokenSource VS手動結束任務

bool aBoolean = true; 

Task.Factory.StartNew(() => 
    while(aBooloean) { 
     ... 
    } 
} 

是更好由具有全球布爾退出任務退出任務?

或者使用CancellationTokenSource更好嗎?

何時適合使用CancellationTokenSource來結束任務?

當您使用CancellationTokenSource並使事情處於不一致狀態時,它是否會引發異常?

感謝

回答

3

有一個「全球性」的布爾冒着被優化或高速緩存到CPU緩存的風險,你可能看不到值的變化。 CancellationTokenSource推薦取消Task的方法。該任務使用令牌來測試是否要求取消並簡單地從任務的操作委託中返回。如果你不想要的話,不需要拋出異常。

+0

我不知道,所以如果我設置全局布爾值,它最終會接受更改嗎?或者只是因爲緩存中的變化而延遲更改? – TheWommies 2012-08-16 22:51:32

+1

這取決於幾種情況;有時從不。只要你聲明它是volatile的,或者使用'Thread.VolatileWrite'和'Thread.VolatileRead',你就可以使用這樣的布爾字段。 'CancelationTokenSource'的好處之一是它與特定的實現分離。因此,您可以在您未編寫的多個任務或任何其他支持取消令牌的代碼之間共享令牌。如果您在多個類中並行執行任務,這非常有用。 – 2012-08-17 02:36:13