2016-04-13 21 views
3

次のWeb APIエンドポイントはまだ、次のエラーを取得している:非同期のWeb APIエンドポイント

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

私はEntity Frameworkのから返されたデータを.ToListAsyncを使用していますので、私は問題を仮定していることです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

あなたはasyncawaitキーワードが欠落しています。

  1. asyncをメソッドシグネチャに追加します。
  2. _unitOfWork.GetRepository...ToListAsync()へお電話

コードにawaitを追加:Asynchronous Programming with Async and Await:ここに参照として

[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; 
} 

非同期プログラミングに良いリンクです。

+0

それはなぜ以前のことではないのですか?古いコードは単に既存のタスクを返しますが、フレームワークは違いを伝えることができません。このような関数を簡単に書くためには、 – usr

+0

が必要です。呼び出し元は、メソッドがasyncを使用して実装されているかどうかを判断することはできません。コードがコンパイルされると、この情報は失われます。しかし、おそらくここでの使用には、このコードを動作させる他の効果があります。私はそれがなぜ起こるかはわかりません。 – usr

+1

さて、そうでした。今は素晴らしい作品です。私はこれをTypeAheadコントロールで使用しています。文字通りキーを押し下げることができます。 –

関連する問題