2012-09-24 12 views
7

Parallel.ForEachループのキャンセルを許可しようとしています。 this MSDN articleによれば、それは可能であり、私はそれらのコーディングに従っています。処理されていないOperationCanceledExceptionがParallel.ForEachからスローされたとき

しかし
// 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: 

私はすぐそこに例外ハンドラを持っているので、私はクラッシュを理解していない。何か案は?

+0

私はあなたが記述している問題は表示されません。「キャッチ」はうまく動作します。あなたの問題を示す完全で短いコードを投稿できますか? – svick

+0

私は、少なくともこの例外を除いて、アプリケーションがクラッシュしたとは思わない。あなたのアプリがクラッシュしていないか(クラッシュしたことをどのように知っていますか?)、またはこれが最後に発生した例外ではありません。 – usr

+0

@usrはい、あなたは正しいです。私はデバッガでそれを実行していましたが、例外が実行時を停止するのを見たとき、私はアプリをクラッシュさせる例外だと考えました。私はいくつかの例外がそれらをクラッシュさせているのを知らなかった。 – Doug

答えて

2

po.CancellationToken.ThrowIfCancellationRequested();が明示的に例外をスローしていて、未処理です。例外ハンドラはParrallel.ForEach()呼び出しの周りにある可能性がありますが、例外はラムダ式では処理されません。ラムダ式の中で行を削除するか、例外ハンドラを追加すると動作するはずです。

詳細については、Cancelling a Task is throwing an exceptionを参照してください。

+0

MSDNの例が間違っていると言っていますか? – svick

+0

@svickおそらく。私がリンクしている答えを見て、それが示唆するものを試してみてください。それが動作すれば、それは動作します。 – akton

+0

@akton:lamba式の中にtry/catchを入れようとしましたが、それでも実行時エラーが発生します。 – Doug

関連する問題