2012-04-27 8 views
239

編集使用している場合HttpClient.GetAsync(...)返すことはありません:テストケースでThis questionが、それは同じ問題であるかもしれないように見えますが、何の応答がありません...のawait /非同期

編集を5タスクがWaitingForActivation状態に固執しているように見えます。

.NET 4.5のSystem.Net.Http.HttpClientを使用して、奇妙な動作が発生しました。たとえば、httpClient.GetAsync(...)への呼び出し結果が返されることはありません。

これは、新しいasync/await言語機能とタスクAPIを使用している場合にのみ発生します。コードは継続性のみを使用している場合には常に動作するようです。

/api/test1 
/api/test2 
/api/test3 
/api/test4 
/api/test5 <--- never completes 
/api/test6 

ここでは、エンドポイントのそれぞれに同じデータを返し、次のGETエンドポイントを公開するには、Visual Studioで新しい「MVC 4 WEBAPIプロジェクト」に11をこのドロップ - ここ

は、問題を再現するいくつかのコードです(stackoverflow.comからの応答ヘッダー)を除き、/api/test5は完了しません。

HttpClientクラスにバグがありましたか、何らかの方法でAPIを悪用しましたか?再現する

コード:

public class BaseApiController : ApiController 
{ 
    /// <summary> 
    /// Retrieves data using continuations 
    /// </summary> 
    protected Task<string> Continuations_GetSomeDataAsync() 
    { 
     var httpClient = new HttpClient(); 

     var t = httpClient.GetAsync("http://stackoverflow.com", HttpCompletionOption.ResponseHeadersRead); 

     return t.ContinueWith(t1 => t1.Result.Content.Headers.ToString()); 
    } 

    /// <summary> 
    /// Retrieves data using async/await 
    /// </summary> 
    protected async Task<string> AsyncAwait_GetSomeDataAsync() 
    { 
     var httpClient = new HttpClient(); 

     var result = await httpClient.GetAsync("http://stackoverflow.com", HttpCompletionOption.ResponseHeadersRead); 

     return result.Content.Headers.ToString(); 
    } 
} 

public class Test1Controller : BaseApiController 
{ 
    /// <summary> 
    /// Handles task using Async/Await 
    /// </summary> 
    public async Task<string> Get() 
    { 
     var data = await Continuations_GetSomeDataAsync(); 

     return data; 
    } 
} 

public class Test2Controller : BaseApiController 
{ 
    /// <summary> 
    /// Handles task by blocking the thread until the task completes 
    /// </summary> 
    public string Get() 
    { 
     var task = Continuations_GetSomeDataAsync(); 

     var data = task.GetAwaiter().GetResult(); 

     return data; 
    } 
} 

public class Test3Controller : BaseApiController 
{ 
    /// <summary> 
    /// Passes the task back to the controller host 
    /// </summary> 
    public Task<string> Get() 
    { 
     return Continuations_GetSomeDataAsync(); 
    } 
} 

public class Test4Controller : BaseApiController 
{ 
    /// <summary> 
    /// Handles task using Async/Await 
    /// </summary> 
    public async Task<string> Get() 
    { 
     var data = await AsyncAwait_GetSomeDataAsync(); 

     return data; 
    } 
} 

public class Test5Controller : BaseApiController 
{ 
    /// <summary> 
    /// Handles task by blocking the thread until the task completes 
    /// </summary> 
    public string Get() 
    { 
     var task = AsyncAwait_GetSomeDataAsync(); 

     var data = task.GetAwaiter().GetResult(); 

     return data; 
    } 
} 

public class Test6Controller : BaseApiController 
{ 
    /// <summary> 
    /// Passes the task back to the controller host 
    /// </summary> 
    public Task<string> Get() 
    { 
     return AsyncAwait_GetSomeDataAsync(); 
    } 
} 
+2

これは同じ問題ではないようですが、そのことを知っているだけで、ベータWRT非同期メソッドにはMVC4のバグがあります(http://stackoverflow.com/questionsを参照)。/9627329/async-as-as-action-to-run-synchronous-code –

+0

ありがとうございます - 私はそれに気をつけます。この場合、 'HttpClient.GetAsync(...)'の呼び出しのためにメソッドは常に非同期であるべきだと思いますか? –

答えて

関連する問題