2013-10-23 37 views
2

我用例子的形式asp.net here异步等待,或只是任务<T>

于是,我问我,什么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); 
    } 
} 

消逝时间是完全一样的我.. 我开始与异步,所以也许这是一个愚蠢的问题,但我想确定之前采取一个不好的方向:)

回答

2

通常情况下,一个函数将使用await ED值对于一些进一步的计算(甚至与它又将开始新async任务和await他们...)return之前荷兰国际集团最终结果。然后,C#编译器将重写该函数以返回Task,该结果一旦可用,就会生成最终的结果。

在你的情况下,最终结果与你调用的异步操作的结果相同,所以你可以直接返回该任务。然而,正如Cory在他的回答中指出的那样,如果在你的函数中抛出一个异常,就会有区别 - 使用一个异步函数,它将被包装到结果任务中,否则它将正常传播,并且必须由呼叫者。

+0

谢谢你补充一点。 –

5

这两者之间存在一个小而重要的行为差异:在异步方法中引发的异常将被包装在任务中。在你的非异步方法中,它只会在调用时抛出,并且不会返回任务。

很多使用任务的代码并不期望在调用时引发异常。我建议不要这样做,除非你确定它不会抛出。

+0

谢谢你的观点。我加了+1 –