首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种简单的方法来返回包含异常的任务?

有没有一种简单的方法来返回包含异常的任务?
EN

Stack Overflow用户
提问于 2014-03-25 08:38:47
回答 2查看 12.1K关注 0票数 20

我的理解是,return Task.FromResult(foo)是一个简单的简写,表示:

代码语言:javascript
复制
var tcs = new TaskCompletionSource<TFoo>();
tcs.SetResult(foo);
return tcs.Task;

返回异常状态的任务是否有等价物?

代码语言:javascript
复制
var tcs = new TaskCompletionSource<TFoo>();
tcs.SetException(new NotSupportedException()); // or whatever is appropriate
return tcs.Task;

我没有看到任何像Task.FromException这样的东西。或者只抛出异常而不返回任务会更合适吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-25 11:01:44

据我所知,

Task.FromResult(foo)是一种简单的简写,意思是...TaskCompletionSource.SetResult

实际上,Task.FromResult不使用TaskCompletionSourceits implementation要简单得多。

返回异常状态的任务是否有等价物?

我认为TaskCompletionSource将是最好的选择。你也可以这样做:

代码语言:javascript
复制
static Task FromExAsync(Exception ex) 
{
    var task = new Task(() => { throw ex; });
    task.RunSynchronously();
    return task;
}

在通过await tasktask.Wait()观察到异常之前,异常不会传播到返回的task之外,这应该是所需的行为。

请注意,如果传递给FromExAsync的异常是活动异常(即已经在其他地方抛出并捕获),则像这样重新抛出它会丢失存储在异常中的当前堆栈跟踪和Watson存储桶信息。有两种方法来处理它:

  • AggregateException包装异常。这将使原始异常作为AggregateException.InnerException

可用

代码语言:javascript
复制
static Task FromExAsync(Exception ex) 
{
    var task = new Task(() => { throw new AggregateException(ex); });
    task.RunSynchronously();
    return task;
}

  • 使用ExceptionDispatchInfo.Capture传递活动异常的状态:

代码语言:javascript
复制
static Task FromExAsync(Exception ex) 
{
    var ei = System.Runtime.ExceptionServices.ExceptionDispatchInfo.Capture(ex);
    var task = new Task(() => { ei.Throw(); });
    task.RunSynchronously();
    return task;
}

最后,也许最简单但最糟糕的选择(由于overhead of the state machine和编译器警告)是从async方法抛出:

代码语言:javascript
复制
static async Task FromExAsync(Exception ex)
{
    throw ex;
}
票数 14
EN

Stack Overflow用户

发布于 2015-06-03 20:10:20

从bcl4.6开始,.NET中有一个Task.FromException方法。

还有Task.FromCanceled

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22623364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档