我使用示例表单asp.net here
所以,我问我,2个代码之间有什么区别:
public class ServiceTest
{
public Task<List<Widget>> WidgetsAsync(CancellationToken cancellationToken = default(CancellationToken))
{
var widgetService = new WidgetService();
return widgetService.GetWidgetsAsync(cancellationToken);
}
public Task<List<Product>> ProductAsync(CancellationToken cancellationToken = default(CancellationToken))
{
var prodService = new ProductService();
return prodService.GetProductsAsync(cancellationToken);
}
public Task<List<Gizmo>> GizmoAsync(CancellationToken cancellationToken = default(CancellationToken))
{
var gizmoService = new GizmoService();
return gizmoService.GetGizmosAsync(cancellationToken);
}
}
和
public class ServiceTest
{
public async Task<List<Widget>> WidgetsAsync(CancellationToken cancellationToken = default(CancellationToken))
{
var widgetService = new WidgetService();
return await widgetService.GetWidgetsAsync(cancellationToken);
}
public async Task<List<Product>> ProductAsync(CancellationToken cancellationToken = default(CancellationToken))
{
var prodService = new ProductService();
return await prodService.GetProductsAsync(cancellationToken);
}
public async Task<List<Gizmo>> GizmoAsync(CancellationToken cancellationToken = default(CancellationToken))
{
var gizmoService = new GizmoService();
return await gizmoService.GetGizmosAsync(cancellationToken);
}
}
我的经历时间与我完全相同.. 我从异步开始,所以也许这是一个愚蠢的问题,但我想在确定方向之前确定:)
答案 0 :(得分:5)
两者之间存在一个小但主要的行为差异:异步方法内部抛出的异常将包含在Task中。在非异步方法中,它只会被调用,并且不会返回任何任务。
使用Tasks的许多代码都不期望在调用时抛出异常。除非你确定它不会扔掉,否则我建议不要这样做。
答案 1 :(得分:2)
通常情况下,函数会使用await
ed值进行一些进一步的计算(甚至可能用它开始新的async
任务,然后await
依次开始......){ {1}最终结果。然后,C#编译器将重写该函数以返回return
,一旦可用,就会生成 final 结果。
在您的情况下,最终结果与您调用的异步操作的结果相同,因此您也可以直接返回该任务。然而,正如Cory在他的回答中指出的那样,如果在你的函数中抛出一个异常会有一个区别 - 使用异步函数,这将被包装到结果任务中,否则它将正常传播并且必须由呼叫者。