我的理解是,return Task.FromResult(foo)是一个简单的简写,表示:
var tcs = new TaskCompletionSource<TFoo>();
tcs.SetResult(foo);
return tcs.Task;返回异常状态的任务是否有等价物?
var tcs = new TaskCompletionSource<TFoo>();
tcs.SetException(new NotSupportedException()); // or whatever is appropriate
return tcs.Task;我没有看到任何像Task.FromException这样的东西。或者只抛出异常而不返回任务会更合适吗?
发布于 2014-03-25 11:01:44
据我所知,
Task.FromResult(foo)是一种简单的简写,意思是...
TaskCompletionSource.SetResult。
实际上,Task.FromResult不使用TaskCompletionSource,its implementation要简单得多。
返回异常状态的任务是否有等价物?
我认为TaskCompletionSource将是最好的选择。你也可以这样做:
static Task FromExAsync(Exception ex)
{
var task = new Task(() => { throw ex; });
task.RunSynchronously();
return task;
}在通过await task或task.Wait()观察到异常之前,异常不会传播到返回的task之外,这应该是所需的行为。
请注意,如果传递给FromExAsync的异常是活动异常(即已经在其他地方抛出并捕获),则像这样重新抛出它会丢失存储在异常中的当前堆栈跟踪和Watson存储桶信息。有两种方法来处理它:
AggregateException包装异常。这将使原始异常作为AggregateException.InnerException可用
static Task FromExAsync(Exception ex)
{
var task = new Task(() => { throw new AggregateException(ex); });
task.RunSynchronously();
return task;
}ExceptionDispatchInfo.Capture传递活动异常的状态:
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方法抛出:
static async Task FromExAsync(Exception ex)
{
throw ex;
}发布于 2015-06-03 20:10:20
从bcl4.6开始,.NET中有一个Task.FromException方法。
https://stackoverflow.com/questions/22623364
复制相似问题