2017-07-01 24 views
1

私はクライアントサーバーアプリケーションを持っています。 Wpf - Web apiこれは1台のマシンで動作しているので少し問題がありますが、別のマシンに切り替えると問題はありません。HttpClient要求を送信したが受信していない

public async Task<IEnumerable<T>> Get() 
    { 
     var result = (IEnumerable<T>)null; 

     //Gets to this line and does not throw exception 
     var response = await _httpClient.GetAsync(BaseApiAddress); 

     if (!response.IsSuccessStatusCode) 
     { 
      ThrowInvalidException(response); 
     } 
     var resultAsString = await response.Content.ReadAsStringAsync(); 
     result = JsonConvert.DeserializeObject<IEnumerable<T>>(resultAsString); 
     return result; 
    } 

APIメソッド:

[HttpGet] 
    public virtual IEnumerable<T> Get() 
    { 
     var items = Repository.Get().ToArray(); 
     return items; 
    } 

とリポジトリ:

public IQueryable<T> Get() 
    { 
     return _context.Set<T>(); 
    } 

私は、APIを取得し、それがデータを持っており、あるかのように見えるコードをデバッグしながら、データを取得しますそこではAPI上のメソッドを完了します。そのすべてが、GetAsyncメソッドに返されることは決してありませんでした。

私はここでレンガの壁に当たっていて、実際にはどこから見て始めるべきか分からない。どんな提案も非常に役に立ちます。

+1

同期コンテキストに起因するデッドロックの古典的なケースのように見えます。 'var response = await _httpClient.GetAsync(BaseApiAddress).ConfigureAwait(false);' –

+0

それを試してみてください!どうもありがとうございます! – JamTay317

+0

デッドロックがハックであることを修正するためにconfigureAwaitを使用し、あらゆる状況で動作しないように注意してください。非同期呼び出しをブロックしない方が良いです。 – Crowcoder

答えて

1

あなたが同期コンテキストで実行している場合ならば、あなたはデッドロックを取得します:呼び出し側がタスクの内部task.Result

  • を呼び出し、例えば(タスクに同期的に待機

    • 、あなたがawaitを使用

    修正は、同期コンテキストに継続を掲載避けるために.ConfigureAwait(false)を使用することです3210

    var response = await _httpClient.GetAsync(BaseApiAddress).ConfigureAwait(false); 
    

    もちろん、可能な限り、タスクの同期を待つ必要はありません。

  • +0

    ありがとう、だから私がしたのは、MethodThatCallsApi()を待ちます。ありがとうございました – JamTay317

    関連する問題