我使用的是TPL数据流块来处理消息流。我的数据流网络由两个块,一个BufferBlock和ActionBlock,与动作块被定义为:
_actionBlock = new ActionBlock<Func<Task>>((Action<Func<Task>>) ProcessRequest,
new ExecutionDataflowBlockOptions()
{
MaxDegreeOfParallelism = 4,
});
如果动作块内发生错误,我想让故障向上传播和退出应用程序。后来我打算在逻辑添加这里处理瞬态错误,但现在,任何错误应该导致应用程序与故障细节退出。为此,我已经添加了这样的ContinueWith部分:
_actionBlock
.Completion
.ContinueWith(dbt =>
{
var inner = dbt.Exception.InnerExceptions.First();
throw inner;
},
TaskContinuationOptions.OnlyOnFaulted
);
问题是,“扔内”不会传播到任何地方,如果异常是被吞噬的应用程序只是进行。我没有任何进一步的异常处理程序在我的代码。作为一个实验我已经试过
Dispatcher.CurrentDispatcher.Invoke(() => throw ...)
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(ToplevelHandler);
(从未引发的异常达到TopLevelHandler)
这些都没有帮助。
我怎样才能让我扔ContinueWith函数内部的异常传播到应用程序的顶部,并与一个错误消息的应用程序退出?
从并发在C#食谱(斯蒂芬·克利里)报价:
从数据流块捕获异常,等待其完成财产。完成属性返回一个任务完成的块时,将完成,如果块故障,完成任务也发生故障。
actionBlock = new ActionBlock<Func<Task>>((Action<Func<Task>>) ProcessRequest,
new ExecutionDataflowBlockOptions()
{
MaxDegreeOfParallelism = 4,
});
await actionBlock.Completion;