簡體   English   中英

為什么某些異步方法具有異步而其他異步方法卻沒有

[英]Why some async methods have async while other don't

我試圖了解何時使用等待/異步。 在閱讀了互聯網上的幾篇文章之后,我開始分析Asp.Net Identity源代碼。 這是RoleStore.cs的有趣片段

https://aspnetidentity.codeplex.com/SourceControl/latest#src/Microsoft.AspNet.Identity.EntityFramework/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

是的,您可以將其標記為asyncawait任務。 它不會破壞任何內容(嗯,它在對已處置對象進行調用時確實會更改錯誤處理語義),但是也沒有理由這樣做。 您將竭盡全力添加無法完成任何工作的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM