数据流(TPL) - 异常处理问题?

时间:2014-07-23 19:47:58

标签: c# async-await tpl-dataflow

我不确定我做错了什么,或者这是Dataflow的问题,但是当Receive()抛出异常时我无法解决问题。 当我运行此测试时:

public class AsyncProblem
{
    [Fact]
    public void AsyncVsAwaiterProblem()
    {
        var max = 1000;
        var noOfExceptions = 0;
        for (int i = 0; i < max; i++)
        {
            try
            {
                Await().Wait();
            }
            catch
            {
                noOfExceptions++;
            }
        }
        Assert.Equal(max,noOfExceptions);
    }

    public async Task Await()
    {
        bool firstPassed = false;
        var divideBlock = new TransformBlock<int, int>((x) =>
        {
            if (firstPassed)
                throw new ArgumentException("error");
            firstPassed = true;
            return 0;
        });
        divideBlock.Post(2);
        divideBlock.Post(3); // this should cause failure;
        divideBlock.Complete();

        while (await divideBlock.OutputAvailableAsync())
        {
                var value = divideBlock.Receive(); // this should throw exception on second call
        }
        try
        {
            divideBlock.Completion.Wait();
        }
        catch
        {
        }
    }
}

我的结果不一致,首先运行:

Xunit.Sdk.EqualExceptionAssert.Equal() Failure 
Expected: 1000 
Actual:  127

然后再次运行:

Xunit.Sdk.EqualExceptionAssert.Equal() Failure
Expected: 1000
Actual:   14

有人可以确认它不是“在我的机器上”唯一的问题吗?

要点:https://gist.github.com/plentysmart/1c2ed2e925cc3f690f61

1 个答案:

答案 0 :(得分:2)

实际上,我认为混淆是由于OutputAvailableAsync行为造成的。当永远不再有输出时,此方法将返回false

当块发生故障时(即,由于转换委托的异常而导致),它将清除输入和输出缓冲区。这会导致OutputAvailableAsync返回false