加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在继续执行任务时保存异常

发布时间:2020-12-15 03:42:32 所属栏目:百科 来源:网络整理
导读:我有一个任务 T: TaskA someTask = ... 此任务可能导致成功,故障或取消. 当任务成功时,我想转换结果,如果不成功则保存结果. 当someTask引发异常时,这似乎是非常困难的. 我试过的 TaskB resultTask = StartMyTask().ContinueWithB( t = Foo(t.Result),TaskCo
我有一个任务< T:
Task<A> someTask = ...

此任务可能导致成功,故障或取消.

当任务成功时,我想转换结果,如果不成功则保存结果.

当someTask引发异常时,这似乎是非常困难的.

我试过的

Task<B> resultTask = StartMyTask().ContinueWith<B>(
    t => Foo(t.Result),TaskContinuationOptions.OnlyOnRanToCompletion);

如果某些任务发生故障,则会导致resultTask被取消.我想要它的错.

Task<B> resultTask = StartMyTask().ContinueWith<B>(
    t => Foo(t.Result));

这会导致Visual Studio调试器,因为.Result抛出异常.如果我按F5,resultTask如预期的错误,但它闻起来.

有没有办法让resultTask与someTask的相同的结果,如果someTask的错误?

本质上我要做的就是用任务来表达这样的东西:

int F()
{
    throw new SomeException();
}

string G(int x)
{
    return x.ToString();
}

try
{
    string result = G(F());
}
catch (SomeException e)
{
    ...
}

解决方法

任务延续是独立的.它们可以用于构建您想要的,但它们不是专门针对该场景设计的.

要问的第一个问题是:关系可以被视为父/子关系(例如,Foo将是StartMyTask的父级)?如果这是有道理的话,那么你可以利用从小孩到家长的状态.

如果将Foo视为“父”,并将StartMyTask视为“小孩”,则设计不成功,那么还有其他选项.连续性对于您需要的是一个低级别(记住,他们只是“在其他任务完成时运行此任务”).

听起来你可能会试图做一些更像“管道”的事情.目前,Rx更适合这种事情.

基于任务的管道并不在这里. ParallelExtensionsExtras library有一个基于任务的管道类,Async CTP有一个TPL数据流库,但目前这两者都不够开发. (例如,Pipeline坚持在独立的线程中运行管道的每个阶段,而Dataflow没有机制可以自动传播异常甚至完成).

所以,如果不能使用Rx,那么我将为任务编写自己的“PipelineTransform”扩展方法,并使用显式TCS来正确处理所有三个完成情况.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读