繁体   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