1 回答
TA贡献1853条经验 获得超6个赞
首先,我建议您不要.Result在Task. 请参阅https://blog.stephencleary.com/2012/07/dont-block-on-async-code.html或https://montemagno.com/c-sharp-developers-stop-calling-dot-result/。
如果你按照上面的建议和await一个Task一个中try块,它会抛出实际的异常,而不是一个AggregateException,所以你也许能完全避免你重新抛出的代码。
否则,如果你真的想坚持你的.Result代码,你可以编写一个通用的包装方法来为你处理常见的错误:
try
{
var task = Task.Run(async () => await this.Object(User));
return task.Result.Content;
}
catch(AggregateException ex)
{
throw ex.InnerException;
}
类似于:
return RunAsync(() => this.Object(User));
private T RunAsync<T>(Func<Task<T>> func)
{
try
{
var task = Task.Run(func);
return task.Result;
}
catch(AggregateException ex)
{
throw ex.InnerException;
}
}
编辑:我刚刚意识到还有另一种方式(参见http://blog.stephencleary.com/2014/12/a-tour-of-task-part-6-results.html),它稍微有点“hacky”,因为感觉更隐蔽,但这个:
var task = Task.Run(async () => await this.Object(User));
return task.GetAwaiter().GetResult().Content;
在.GetAwaiter().GetResult()将同步等待Task(按.Result),但不会换在任何抛出的异常AggregateException-这似乎是你的愿望。
- 1 回答
- 0 关注
- 203 浏览
添加回答
举报