C# 从Parallel.ForEach抛出时未处理的操作CanceledException

C# 从Parallel.ForEach抛出时未处理的操作CanceledException,c#,wpf,exception-handling,parallel.foreach,C#,Wpf,Exception Handling,Parallel.foreach,我正在尝试取消一个并行.ForEach循环。根据,这是可能的,我正在跟踪他们的编码 // Tokens for cancellation ParallelOptions po = new ParallelOptions(); po.CancellationToken = cts.Token; try { Parallel.ForEach(queries, po, (currentQuery) => { // Execute query E

我正在尝试取消一个
并行.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: 
System.OperationCanceledException未由用户代码处理
消息=操作已取消。
Source=mscorlib
堆栈跟踪:
在System.Threading.CancellationToken.ThrowIfCancellationRequested()中
在{PATH}第286行的CraigslistReader.SearchObject.c__显示class7.b__5(查询当前查询)
at System.Threading.Tasks.Parallel.c__;u DisplayClass2d`2.b__;u 23(Int32 i)
at System.Threading.Tasks.Parallel.c__;u DisplayClassf`1.b__;u c()
内部异常:

我的异常处理程序就在那里,所以我不理解崩溃。有什么想法吗?

问题在于
po.CancellationToken.throwifccancellationrequest()显式引发未处理的异常。异常处理程序可能在
parralel.ForEach()
调用中,但在lambda表达式中不处理异常。在lambda表达式中删除该行或添加异常处理程序,它应该可以工作


有关更多信息,请参阅。

@svick。看看我链接的答案,试试它的建议。如果它有效,它就有效。@akton:我试图将try/catch放在lamba表达式中,但仍然会导致运行时错误。@Doug-Hmmm。我会继续挖掘,如果发现任何东西,会告诉你的。给问题一个提示,看看是否还有其他人knows@akton我可以通过在lambda表达式中使用try/catch并将Parallel.ForEach包装在try/catch中来解决这个问题。我不知道为什么我必须同时做这两件事。@public敌手在调用
ThrowIfCancellationRequested()
的过程中加入了try/catch。我看不出你所描述的问题,我觉得
catch
很适合我。你能发布一个完整但简短的代码来说明你的问题吗?我认为这个应用程序没有崩溃,至少没有这个例外。要么你的应用程序没有崩溃(你怎么知道它崩溃了?),要么这不是最后一次发生的异常。@usr是的,你是对的。我在调试器中运行它,当我看到异常停止运行时,我认为是异常导致应用程序崩溃。我不知道有些异常不是崩溃的。