Получить результат от асинхронного метода

c# entity-framework asynchronous

31114 просмотра

2 ответа

4884 Репутация автора

У меня есть этот метод в моем сервисе:

public virtual async Task<User> FindByIdAsync(string userId)
{
    this.ThrowIfDisposed();
    if (userId == null)
    {
        throw new ArgumentNullException("userId");
    }
    return await this.repository.FindByIdAsync(userId);
}

и тогда в представлении у меня есть этот код:

using (var service = new UserService(new CompanyService(), User.Identity.GetUserId()))
{
    var user = service.FindByIdAsync(id);
}

но пользователь - это задача, а не пользователь . Я попытался добавить await к вызову службы, но я не могу использовать await, если текущий метод не является асинхронным . Как я могу получить доступ к классу User ?

Автор: r3plica Источник Размещён: 02.01.2014 01:57

Ответы (2)


10 плюса

910 Репутация автора

  • Использование thisв asyncметодах без специального объекта с блокировкой потоков опасно
  • Если вы не можете использовать await, используйте код, подобный следующему.

    Task<User> task = TaskFindByIdAsync();
    
    task.Wait(); //Blocks thread and waits until task is completed
    
    User resultUser = task.Result;
    
Автор: Ilya Tereschuk Размещён: 02.01.2014 02:07

10 плюса

313503 Репутация автора

Решение

Лучшее решение - создать вызывающий метод, asyncа затем использовать его await, как отметил Бас Брекелманс.

Когда вы создаете метод async, вы должны изменить тип возвращаемого значения (если это так void, измените его на Task; в противном случае измените его Tна на Task<T>) и добавьте Asyncсуффикс к имени метода. Если тип возврата не может быть, Taskпотому что это обработчик события, тогда вы можете использовать async voidвместо этого.

Если вызывающий метод является конструктором, вы можете использовать один из этих методов из моего блога. Если вызывающий метод является средством получения свойства, вы можете использовать один из этих методов из моего блога.

Автор: Stephen Cleary Размещён: 02.01.2014 02:13
Вопросы из категории :
32x32