2016-05-13 72 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); 
    } 
} 

回答