c# - TPL 数据流 block 中抛出的 OperationCanceledException 被吞没

标签 c# task-parallel-library tpl-dataflow

由于某种原因,当 OperationCanceledException 被抛入 IDataflowBlock 时,该 block 不会将此异常传播到其 IDataflowBlock.Completion 任务。运行下面的代码示例会返回意外的 IDataflowBlock.Completion.Status == TaskStatus.RanToCompletion

但是,如果 block 中抛出的异常类型更改为 ArgumentNullException,则 IDataflowBlock.Completion.Status 更改为 TaskStatus.Faulted 并将异常保存在其 InnerException 属性中。

知道为什么 OperationCanceledException 被吞没了吗?

[TestFixture]
public class TplDataBlockExceptionTest
{
    [Test]
    public void ShouldThrowException()
    {
        // Arrange
        var block = new TransformBlock<int, string>(i =>
        {
            throw new OperationCanceledException();
            return i.ToString();
        });

        // Act

        block.Post(1);
        block.Complete();

        try
        {
            block.Completion.Wait();
        }
        catch (Exception)
        {
            // ignored
        }

        // Assert

        Assert.That(block.Completion.IsFaulted);
    }
}

最佳答案

关于c# - TPL 数据流 block 中抛出的 OperationCanceledException 被吞没,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37219648/

相关文章:

c# - 异步等待性能 - 直接方法调用与任务包装器调用

c# - Parallel.Invoke() 是创建新线程还是使用线程池中的线程?

c# - 自定义 ActionBlock<T>

c# - 处理大量文件

c# - Linq 中的错误,Count()

c# - 在使用 ASP.NET Web API 2.0 和身份进行外部登录/注册期间从 Facebook 检索其他个人资料信息

c# - 使用 `using(...)` 实际上无用和/或低效?

c# - 如何等待 task.run

c# - TPL 数据流在运行时中断 LinkTo()

c# - 使用 C# 将完整结果集变量中的数据获取到脚本任务