2016-07-13 8 views
0

私はEntity Framework 6の非同期呼び出しを使用しようとしていますが、FindAsyncを呼び出すたびにアプリケーションがハングアップし、コントロールが返されません。以下は、Findを使用する方法です。すべてがうまくいくところです。以下はEF6を呼び出すFindAsyncはアプリケーションをハングします

public CaUsuario GetUsers(RFContext db, int id) 
{ 
     CaUsuario caUsuario = db.CaUsuarios.Find(id); 
     if (caUsuario == null) 
       throw new ObjectNotFoundException("User not found"); 
     return caUsuario; 
} 

ASyncコールA Taskリターンで、asyncを使用する私の試みです。 FindAsyncが呼び出されると、コントロールが返されず、アプリケーションがハングします。

public async Task<CaUsuario> GetUsers(RFContext db, int id) 
{ 
    CaUsuario caUsuario = await db.CaUsuarios.FindAsync(id); 
    if (caUsuario == null) 
     throw new ObjectNotFoundException("User not found"); 
    return caUsuario; 
} 

私は間違っていますか?

+2

どのように非同期のGetUsersを呼びますか? –

+2

あなたはおそらく、コールチェーン/スタックを通して非同期を行っているとは限りません。タスク .Resultとコールチェーンの待機の組み合わせを使用すると、デッドロックが発生します。 – Igor

+0

@YuvalItzchakovあなたはそれを釘付けにしました。私がどのように呼んでいたのかは問題でした。あなたは信用を得ることができるように、答えとして投稿してください。どうもありがとうございます。初めて私はそれを使用します。決して考えなかったでしょう。 – Pascal

答えて

2

"非同期で行かない"場合にハングアップすることがあります。 GetUsersに電話しているものは、asyncawaitのキーワードで、.Resultまたは.Wait()を間違って使用しようとしていないことを確認してください。

public class Consumer 
{ 
    private readonly IUserService _userService; 
    public Consumer(IUserService userService) 
    { 
     _userService = userService; 
    } 

    public async Task ConsumeAsync() 
    { 
     // Correct 
     var user = await _userService.GetUsers(1); 
    } 

    public void Consume() 
    { 
     // Will hang 
     var user = _userService.GetUsers(1).Result; 
    } 
} 
1

あなたはおそらく、あなたのコールチェーン/スタックを介してすべての道非同期(async)行っていない。

以下は、消費クラスであると仮定します。呼び出しチェーンにTask<T>.Resultawaitの組み合わせを使用すると、デッドロックが発生します。

関連する問題