2013-03-16 68 views
4

觀察取消令牌消除請求的推薦方法似乎是ThrowIfCancellationRequested用戶代碼重新拋出OperationCanceledException,從其自己的try-catch中捕獲

但是,如果它被用戶try-catch抓住會發生什麼?從MSDN's "How to: Cancel a Task and Its Children"用的try-catch添加說明問題:

snippet: 

static void DoSomeWork(int taskNum, CancellationToken ct) 
{ 
    try 
    { 
     for (int i = 0; i < maxIterations; i++) 
     { 
      // Do a bit of work. Not too much. 
      ... 
      //ok not to do this check? most likely IsCancellationRequested does it already 
      //if (ct.IsCancellationRequested) 
      //{ 


       ct.ThrowIfCancellationRequested(); 


      //} 
     } 
    } 
    catch(OperationCanceledException e1) // catching likely my own exception 
    { 
     throw; // correct? anything else belongs here? 
    } 
    catch // ... 
    { 
     // do whatever else I might want to do here 
    } 
} 

上午我精再扔?即我不打擾Task API中的任何內容,是嗎? (我也會表達個人意見,有秩序的取消 - 清理 - 回報的觀點似乎與例外是它的載體不一致;我認爲還有其他方法可以實現這一點 - 我會繼續挖掘)

+0

我這樣做,它似乎工作。有時候這就是你所需要的。 – theMayer 2013-03-17 04:27:48

回答

2

rethrow應該沒問題。但不建議使用無參數捕獲,因爲它會吞噬任何異常信息。你應該使用catch(Exception)並且至少記錄這些異常。

+0

沒錯。我只是嘲笑MSDN示例的頂部。 – 2013-03-17 05:02:42

+0

這與問題本身毫無關係。 – Matz 2014-04-28 12:49:09

+0

@Matz,使用沒有參數的catch是非常不好的做法,有人可能會決定從問題中複製代碼。 – fithu 2017-07-11 23:23:21

相關問題