【问题标题】:Understanding exception handling in ActionBlock了解 ActionBlock 中的异常处理
【发布时间】:2017-11-04 20:06:29
【问题描述】:

谁能解释为什么当我们等待动作块完成时第一个代码块会抛出,而第二个代码块不会?没有任何数据流块的链接,因此不需要传播。

动作块定义1:

ActionBlock<int> workerBlock = new ActionBlock<int>(async (i) =>
{
    await Task.Delay(1);
    throw new OperationCanceledException();
});

动作块定义2:

ActionBlock<int> workerBlock = new ActionBlock<int>(async (i) =>
{
    await ExceptionThrower1();
});


private static async Task ExceptionThrower1()
{
    CancellationTokenSource source= new CancellationTokenSource();
    source.CancelAfter(100);
    await ExceptionThrower2(source.Token);
}

private static async Task ExceptionThrower2(CancellationToken token)
{
    await Task.Delay(1000);
    try
    {
        token.ThrowIfCancellationRequested();
    }
    catch (OperationCanceledException e)
    {
        Console.WriteLine(e);
        throw;
    }
}

测试程序:

workerBlock.SendAsync(1).GetAwaiter().GetResult();
workerBlock.SendAsync(1).GetAwaiter().GetResult();
workerBlock.SendAsync(1).GetAwaiter().GetResult();

workerBlock.Complete();
workerBlock.Completion.GetAwaiter().GetResult();
Console.WriteLine("Done");

如果我使用第一个定义,则不会打印“完成”,因为等待完成会引发异常。在第二个定义中,“完成”被打印出来,尽管我可以看到在 ExceptionThrower2 中打印出异常。

根据这篇博文 - https://blogs.msdn.microsoft.com/pfxteam/2011/11/09/exception-handling-in-tpl-dataflow-networks/,即使是第二个也应该被考虑和未处理的异常并在完成时被抛出,对吗?

【问题讨论】:

    标签: c# task tpl-dataflow


    【解决方案1】:

    我无法复制您描述的行为,在我的情况下,每次都打印“完成”。但是 OperationCanceledException 属于“表明合作取消的异常”类别,请查看 Exception Handling (Task Parallel Library) 并搜索 OperationCanceledException。

    【讨论】:

    • 是的,你是对的。我想我一直在尝试在第一个 sn-p 中只使用“异常”。 OperationCanceledException 的处理方式不同。
    【解决方案2】:

    试试

    ActionBlock<int> workerBlock = new ActionBlock<int>((i) =>
    {
        ExceptionThrower1().Wait();
    });
    

    ActionBlock 已经处理了异步的东西;添加额外的层似乎会吞噬你的例外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多