异步等待或只是TasK <t> </t>

时间:2013-10-23 21:56:33

标签: c# asp.net-mvc-4 asynchronous

我使用示例表单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);
    }
}

我的经历时间与我完全相同.. 我从异步开始,所以也许这是一个愚蠢的问题,但我想在确定方向之前确定:)

2 个答案:

答案 0 :(得分:5)

两者之间存在一个小但主要的行为差异:异步方法内部抛出的异常将包含在Task中。在非异步方法中,它只会被调用,并且不会返回任何任务。

使用Tasks的许多代码都不期望在调用时抛出异常。除非你确定它不会扔掉,否则我建议不要这样做。

答案 1 :(得分:2)

通常情况下,函数会使用await ed值进行一些进一步的计算(甚至可能用它开始新的async任务,然后await依次开始......){ {1}最终结果。然后,C#编译器将重写该函数以返回return,一旦可用,就会生成 final 结果。

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