我不确定我做错了什么,或者这是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
有人可以确认它不是“在我的机器上”唯一的问题吗?
答案 0 :(得分:2)
实际上,我认为混淆是由于OutputAvailableAsync
行为造成的。当永远不再有输出时,此方法将返回false
。
当块发生故障时(即,由于转换委托的异常而导致),它将清除输入和输出缓冲区。这会导致OutputAvailableAsync
返回false
。