从Parallel.ForEach抛出时未处理的OperationCanceledException

Dou*_*oug 7 c# wpf exception-handling 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);
}
Run Code Online (Sandbox Code Playgroud)

但是,当我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: 
Run Code Online (Sandbox Code Playgroud)

我有异常处理程序,所以我不明白崩溃.有任何想法吗?

akt*_*ton 2

问题是po.CancellationToken.ThrowIfCancellationRequested();显式抛出未处理的异常。异常处理程序可能位于Parrallel.ForEach()调用周围,但异常不在 lambda 表达式内处理。删除该行或在 lambda 表达式中添加异常处理程序,它应该可以工作。

有关更多信息,请参阅取消任务引发异常。