2016-05-13 73 views
2

由于某种原因,当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); 
    } 
} 

回答