簡體   English   中英

從Parallel.ForEach拋出時未處理的OperationCanceledException

[英]Unhandled OperationCanceledException when thrown from Parallel.ForEach

我試圖允許取消Parallel.ForEach循環。 根據這篇MSDN文章 ,這是可能的,我正在關注他們的編碼。

// Tokens for cancellation 
ParallelOptions po = new ParallelOptions();
po.CancellationToken = cts.Token;

try
{
    Parallel.ForEach(queries, po, (currentQuery) =>
    {
        // Execute query
        ExecuteQuery(currentQuery);

        // Throw exception if cancelled 
        po.CancellationToken.ThrowIfCancellationRequested(); // ***
    }); 
}
catch (OperationCanceledException cancelException)
{
    Console.WriteLine(cancelException.Message);
}

但是,當我調用cts.Cancel(); 從用戶可訪問的功能,應用程序崩潰在標有上述星號的行上,並顯示錯誤:

System.OperationCanceledException was unhandled by user code
  Message=The operation was canceled.
  Source=mscorlib
  StackTrace:
   at System.Threading.CancellationToken.ThrowIfCancellationRequested()
   at CraigslistReader.SearchObject.<>c__DisplayClass7.<bw_DoWork>b__5(Query currentQuery) in {PATH}:line 286
   at System.Threading.Tasks.Parallel.<>c__DisplayClass2d`2.<ForEachWorker>b__23(Int32 i)
   at System.Threading.Tasks.Parallel.<>c__DisplayClassf`1.<ForWorker>b__c()
InnerException: 

我有異常處理程序,所以我不明白崩潰。 有任何想法嗎?

問題是po.CancellationToken.ThrowIfCancellationRequested(); 顯式拋出一個未處理的異常。 異常處理程序可能在Parrallel.ForEach()調用周圍,但異常不在lambda表達式中處理。 刪除行或在lambda表達式中添加異常處理程序,它應該工作。

有關詳細信息,請參閱取消任務正在拋出異常

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM