由於某種原因,當OperationCanceledException
被拋入IDataflowBlock
中時,該塊不會將此異常傳播到其IDataflowBlock.Completion
任務。運行下面的代碼示例會返回一個意外的IDataflowBlock.Completion.Status == TaskStatus.RanToCompletion
。在tpl dataflow塊中拋出的OperationCanceledException被吞噬
然而,如果在該塊中的拋出的異常類型被改變爲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);
}
}