C#异步库方法应该等待吗?

Nei*_*ski 10 c# async-await

应该调用异步库方法await吗?例如,假设我有一个数据服务库方法,可以访问名为"repository" 的Entity Framework 6数据上下文.据我所知,我有两种方法来定义这个方法:

public static async Task<IEnumerable<Blogs>>
    GetAllBlogsAsync(EfDataContext db)
{
    return await db.Blogs
        .OrderByDescending(b => b.Date)
        .SelectAsync();
}
Run Code Online (Sandbox Code Playgroud)

或没有async/ await装饰

public static Task<IEnumerable<Blogs>>
    GetAllBlogsAsync(EfDataContext db)
{
    return db.Blogs
        .OrderByDescending(b => b.Date)
        .SelectAsync();
}
Run Code Online (Sandbox Code Playgroud)

在应用程序端点,在这种情况下是MVC控制器操作,对于任一方法,调用都是相同的:

public async Task<ActionResult> Blogs()
{
    var blogs = await BlogService.GetAllBlogs(_blogRepository);
    return View(blogs);
}
Run Code Online (Sandbox Code Playgroud)

当然,在应用程序调用异步方法链的情况下,这种情况可能会更复杂.链中的每个方法应该调用await,还是应该只await在调用链的末尾有一个语句,这会产生什么区别?

Ste*_*ary 1

异步库方法应该调用await吗?

简短的回答:是的。

长答案:是的,除非您担心服务器应用程序上的内存搅动,并且该方法除了调用另一个方法之外没有任何关系await

删除asyncandawait是一种优化,但是很小。与大多数优化一样,除非您非常小心,否则它可能会导致问题。

在你的例子中:

return db.Blogs
    .OrderByDescending(b => b.Date)
    .SelectAsync();
Run Code Online (Sandbox Code Playgroud)

这大致相当于:

var blogs = db.Blogs;
var query = blogs.OrderByDescending(b => b.Date);
var task = query.SelectAsync();
Run Code Online (Sandbox Code Playgroud)

只有最后一个是实际的异步调用。在这种情况下,只有当您是肯定的并且不会抛出异常时,才可以安全地删除asyncand 。awaitBlogsOrderByDescending