[英]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.