2016-04-13 2 views
3

Следующая Web API конечная точка по-прежнему получает следующее сообщение об ошибке:Асинхронного Web API Endpoint

"A second operation started on this context before a previous asynchronous operation completed."

Поскольку я использую .ToListAsync с возвращенным из Entity Framework, я предполагаю, что проблема с блокировка линии var user.

Как сделать эту часть асинхронной?

[Route("Retailers/{search}")] 
[HttpGet] 
public Task<List<Lookup>> Retailers(string search) 
{ 
    var user = UserManager.FindById(User.Identity.GetUserId()); 
    Guid userId = Guid.Parse(user.Id); 

    var companies = _unitOfWork.GetRepository<Company>().GetAll().Where(c => c.CompanyType == CompanyType.Retail && 
       (c.UserID == null || c.UserID == userId) && c.CompanyName.StartsWith(search)).Take(5) 
       .Select(x => new Lookup { Id = x.Id, Name = x.CompanyName }).ToListAsync(); 

    return companies; 
} 
+1

Блокировка 'FindById' не вызовет этой проблемы. Я подозреваю, что проблема находится где-то в вашей части абстракции работы. –

ответ

2

Вы пропускаете async и await ключевые слова.

  1. Добавить async в форму подписи.
  2. Добавить await на ваш призыв к _unitOfWork.GetRepository...ToListAsync()

Код:

[Route("Retailers/{search}")] 
[HttpGet] 
public async Task<List<Lookup>> Retailers(string search) 
{ 
    var user = UserManager.FindById(User.Identity.GetUserId()); 
    Guid userId = Guid.Parse(user.Id); 

    var companies = await _unitOfWork.GetRepository<Company>().GetAll().Where(c => c.CompanyType == CompanyType.Retail && 
       (c.UserID == null || c.UserID == userId) && c.CompanyName.StartsWith(search)).Take(5) 
       .Select(x => new Lookup { Id = x.Id, Name = x.CompanyName }).ToListAsync(); 

    return companies; 
} 

В качестве ссылки здесь хорошая ссылка асинхронного программирования: Asynchronous Programming with Async and Await.

+0

И почему это работает сейчас и не раньше? Старый код просто возвращает существующую задачу, структура не должна быть в состоянии сказать разницу. – usr

+0

Ожидание существует, чтобы упростить запись таких функций. Вызывающие не могут определить, реализован ли метод с использованием async или нет. Когда код компилируется, эта информация теряется. Но, возможно, использование ожидания здесь имеет некоторый другой эффект, делающий этот код работой. Я не понимаю, почему это было бы. – usr

+1

Ну, да. Прекрасно работает. Я использую это с помощью элемента управления TypeAhead, и я умею буквально удерживать ключ. –

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