为什么有些异步方法有异步而其他方法没有异步

时间:2015-03-24 19:10:56

标签: c# asp.net entity-framework asynchronous

我试图了解何时使用await / async。 在网上阅读了几篇文章后,我开始分析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());
    }

这将编译。我认为这是不正确的,但我不知道为什么。

2 个答案:

答案 0 :(得分:1)

在代码中使用关键字async时,您只需要使用关键字await。您的第一个代码段不使用await,因此不需要async

第二个snippit使用await的原因可能是.WithCurrentCulture();方法正在执行一些特殊操作,因此方法中SynchronizationContext将使用的await将具有存储在其中的某种文化信息。

答案 1 :(得分:1)

它未标记为async,因为它不需要await

是的,您可以将其标记为asyncawait任务。它不会打破任何东西(好吧,它在调用已处置对象时巧妙地改变了错误处理语义),但也没有理由这样做。你不遗余力地添加没有成效的工作。