По какой-то причине, когда OperationCanceledException
выбрасывается внутри IDataflowBlock
, блок не распространяет это исключение на свою задачу IDataflowBlock.Completion
. Выполнение приведенного ниже примера кода возвращает неожиданную ошибку IDataflowBlock.Completion.Status == TaskStatus.RanToCompletion
.
Однако, если тип сгенерированного исключения в блоке изменен на 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);
}
}