![](/img/trans.png)
[英]Why do some async methods require a return type of Task, and others don't
[英]Why some async methods have async while other don't
我试图了解何时使用等待/异步。 在阅读了互联网上的几篇文章之后,我开始分析Asp.Net Identity源代码。 这是RoleStore.cs的有趣片段
/// <summary>
/// Find a role by name
/// </summary>
/// <param name="roleName"></param>
/// <returns></returns>
public Task<TRole> FindByNameAsync(string roleName)
{
ThrowIfDisposed();
return _roleStore.EntitySet.FirstOrDefaultAsync(u => u.Name.ToUpper() == roleName.ToUpper());
}
/// <summary>
/// Insert an entity
/// </summary>
/// <param name="role"></param>
public virtual async Task CreateAsync(TRole role)
{
ThrowIfDisposed();
if (role == null)
{
throw new ArgumentNullException("role");
}
_roleStore.Create(role);
await Context.SaveChangesAsync().WithCurrentCulture();
}
我的问题是:为什么FindByNameAsync
没有异步的关键字,而CreateAsync
了?
我们可以这样写
public async Task<TRole> FindByNameAsync(string roleName)
{
ThrowIfDisposed();
return await _roleStore.EntitySet.FirstOrDefaultAsync(u => u.Name.ToUpper() == roleName.ToUpper());
}
这将编译。 我认为这是不正确的,但我不知道为什么。
在代码中使用关键字await
时,只需使用关键字async
。 您的第一个代码段不使用await
因此不需要async
。
第二个.WithCurrentCulture();
使用await
的原因可能是.WithCurrentCulture();
方法正在做一些特殊的事情,以便该方法中的await
将使用的SynchronizationContext
将在其中存储某种区域性信息。
它没有标记为async
因为它不需要await
。
是的,您可以将其标记为async
并await
任务。 它不会破坏任何内容(嗯,它在对已处置对象进行调用时确实会更改错误处理语义),但是也没有理由这样做。 您将竭尽全力添加无法完成任何工作的工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.