TPL数据流,异常块故障处理程序不传播

问题描述 投票:0回答:1

我使用的是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 ...)
  • 检查的ContinueWith内容在UI线程上运行。
  • 处理使用任何顶级例外: currentDomain.UnhandledException += new UnhandledExceptionEventHandler(ToplevelHandler);

(从未引发的异常达到TopLevelHandler)

这些都没有帮助。

我怎样才能让我扔ContinueWith函数内部的异常传播到应用程序的顶部,并与一个错误消息的应用程序退出?

c# task-parallel-library tpl-dataflow
1个回答
3
投票

从并发在C#食谱(斯蒂芬·克利里)报价:

从数据流块捕获异常,等待其完成财产。完成属性返回一个任务完成的块时,将完成,如果块故障,完成任务也发生故障。

actionBlock = new ActionBlock<Func<Task>>((Action<Func<Task>>) ProcessRequest,
    new ExecutionDataflowBlockOptions()
    {
        MaxDegreeOfParallelism = 4,
    });
await actionBlock.Completion;
© www.soinside.com 2019 - 2024. All rights reserved.