2015-03-24 2 views
1

Я пытаюсь понять, когда использовать await/async. После прочтения нескольких статей в Интернете я начал анализировать исходный код Asp.Net Identity. Вот интересный фрагмент RoleStore.csПочему некоторые методы async имеют async, а другие не

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

Потому что 'FindByNameAsync' ничего не ждет, пока работает 'CreateAsync'. –

ответ

1

При использовании ключевого слова await вам нужно использовать только ключевое слово async. Ваш первый фрагмент кода не использует await, поэтому нет необходимости в async.

Причина вторая Snippit использует await, скорее всего, метод .WithCurrentCulture(); делает что-то особенное, так что SynchronizationContext что await в методе будет использовать будет иметь какую-то информацию культуры, хранящейся в нем.

1

Не указано как async, потому что ему не нужно await.

Да, вы can отметьте его как async и await Задача. это не будет перерыв что-нибудь (ну, он тонко меняет семантику обработки ошибок при вызове на объект-объект), но нет причин для этого. Вы идете на своем пути, чтобы добавить работу, которая ничего не делает продуктивной.

Смежные вопросы