2011-09-27 57 views
0

我有一個主線程啓動一個任務,但不等待它的完成。我也有一個取消按鈕在用戶界面上,點擊我想取消任務。我試圖在任務中的方法中的多個位置執行此操作:主線程退出時取消任務

if (cancelToken.IsCancellationRequested) 
       { 
        return; 
       } 

但是,這似乎並不能以所需的方式工作。

早先我想做cancelToken.ThrowIfCancellationRequested(),但據我瞭解,這引發了一個異常,我沒有在主線程中抓住這個位置。在這種情況下取​​消任務的最好方法是什麼?

+0

向我們展示你的任務的代碼 –

回答

2

推測你的cancelToken最初來自主線程仍然可以訪問的CancellationTokenSource。你應該可以撥打:

cancellationTokenSource.Cancel(); 

在你的取消按鈕的點擊事件處理程序。

ThrowIfCancellationRequested將在任務線程中拋出異常,而不是在主線程中。如果您在主線程中調用ThrowIfCancellationRequested,然後請求Result,則只會在主線程中看到異常。

請注意,如果您在取消請求後才返回,那麼您的任務狀態將最終爲RanToCompletion而非Canceled。調用ThrowIfCancellationRequested是指示取消的首選方式,部分原因是這意味着如果您的任務代碼中有深度堆棧,則不需要擔心從每種方法顯式返回。

我不確定取消是否代表需要觀察的故障,順便說一句 - 我嫌疑人不是,但你應該檢查一下。 (你應該有一個延續來處理錯誤......)

+1

我還要補充說任何ContinueWith(TaskContinuationOptions.OnlyOnCanceled)任務都需要拋出一個異常以便「火」。 –