我试图了解何时使用await / async。 在网上阅读了几篇文章后,我开始分析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());
}
这将编译。我认为这是不正确的,但我不知道为什么。
答案 0 :(得分:1)
在代码中使用关键字async
时,您只需要使用关键字await
。您的第一个代码段不使用await
,因此不需要async
。
第二个snippit使用await
的原因可能是.WithCurrentCulture();
方法正在执行一些特殊操作,因此方法中SynchronizationContext
将使用的await
将具有存储在其中的某种文化信息。
答案 1 :(得分:1)
它未标记为async
,因为它不需要await
。
是的,您可以将其标记为async
和await
任务。它不会打破任何东西(好吧,它在调用已处置对象时巧妙地改变了错误处理语义),但也没有理由这样做。你不遗余力地添加没有成效的工作。