异步等待或只是TasK

本文关键字:TasK 等待 异步 | 更新日期: 2023-09-27 18:36:33

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

所以,我

问我,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);
    }
}

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

异步等待或只是TasK<T>

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

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

通常,函数会在return最终结果之前使用 await ed 值进行一些进一步的计算(甚至可能使用它启动新的async任务并依次await它们......)。然后,C# 编译器将重写函数以返回一个Task,该在最终结果可用后生成最终结果。

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