1

我在这里使用示例表单 asp.net

所以,我问我,两个代码有什么区别:

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);
    }
}

经过的时间对我来说完全一样..我从异步开始,所以也许这是一个愚蠢的问题,但我想在采取错误的方向之前确定:)

4

2 回答 2

5

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

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

于 2013-10-23T22:31:18.107 回答
2

通常,一个函数会使用awaited 值进行一些进一步的计算(甚至可能async用它开始新的任务,然后await依次......),然后再return得到最终结果。然后,C# 编译器将重写该函数以返回Task产生最终结果的 a,一旦它可用。

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

于 2013-10-23T22:07:05.400 回答