应该调用异步库方法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在调用链的末尾有一个语句,这会产生什么区别?
异步库方法应该调用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
| 归档时间: |
|
| 查看次数: |
741 次 |
| 最近记录: |