【发布时间】:2017-11-04 20:06:29
【问题描述】:
谁能解释为什么当我们等待动作块完成时第一个代码块会抛出,而第二个代码块不会?没有任何数据流块的链接,因此不需要传播。
动作块定义1:
ActionBlock<int> workerBlock = new ActionBlock<int>(async (i) =>
{
await Task.Delay(1);
throw new OperationCanceledException();
});
动作块定义2:
ActionBlock<int> workerBlock = new ActionBlock<int>(async (i) =>
{
await ExceptionThrower1();
});
private static async Task ExceptionThrower1()
{
CancellationTokenSource source= new CancellationTokenSource();
source.CancelAfter(100);
await ExceptionThrower2(source.Token);
}
private static async Task ExceptionThrower2(CancellationToken token)
{
await Task.Delay(1000);
try
{
token.ThrowIfCancellationRequested();
}
catch (OperationCanceledException e)
{
Console.WriteLine(e);
throw;
}
}
测试程序:
workerBlock.SendAsync(1).GetAwaiter().GetResult();
workerBlock.SendAsync(1).GetAwaiter().GetResult();
workerBlock.SendAsync(1).GetAwaiter().GetResult();
workerBlock.Complete();
workerBlock.Completion.GetAwaiter().GetResult();
Console.WriteLine("Done");
如果我使用第一个定义,则不会打印“完成”,因为等待完成会引发异常。在第二个定义中,“完成”被打印出来,尽管我可以看到在 ExceptionThrower2 中打印出异常。
根据这篇博文 - https://blogs.msdn.microsoft.com/pfxteam/2011/11/09/exception-handling-in-tpl-dataflow-networks/,即使是第二个也应该被考虑和未处理的异常并在完成时被抛出,对吗?
【问题讨论】:
标签: c# task tpl-dataflow