【问题标题】:OperationCanceledException thrown in tpl dataflow block gets swallowedtpl 数据流块中抛出的 OperationCanceledException 被吞没
【发布时间】:2016-05-13 21:33:31
【问题描述】:

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

但是,如果块中抛出的异常类型更改为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# task-parallel-library tpl-dataflow


    【解决方案1】:

    【讨论】:

    • 应该注意的是,这种行为在使用HttpClient 类时尤其成问题,它会抛出TaskCanceledException 而不是TimeoutException for some unrelated reason
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多