2012-03-21 9 views
5

これは単純な非同期タスクですが、私はいつも奇妙なコンパイルエラーがあります。このコードは、VS2010で作成されたASP.NET 4プロジェクトのWeb APIサービスから取得します。この非同期タスクメソッドで何が問題になっていますか?

Even ContinueWith(非汎用)は、タスクを暗黙的に返しますが、このエラーは依然として存在します。

コード:あなたの代わりにTask<HttpResponseMessage>Task<Task<HttpResponseMessage>>を戻ってきているので、

public class TestController : ApiController 
{ 
     public Task<HttpResponseMessage> Test() 
     { 
      string url = "http://www.stackoverflow.com"; 
      var client = new HttpClient(); 

      return client.GetAsync(url).ContinueWith<HttpResponseMessage>((request) => 
      { 
       // Error 361 'System.Threading.Tasks.Task' does not contain a definition 
       // for 'Result' and no extension method 'Result' accepting a first argument 
       // of type 'System.Threading.Tasks.Task' could be found 
       // (are you missing a using directive or an assembly reference?) 
       var response = request.Result; 
       response.EnsureSuccessStatusCode(); 

       // Error 364 Cannot implicitly convert type 'System.Threading.Tasks.Task<System.Net.Http.HttpResponseMessage>' to 'System.Net.Http.HttpResponseMessage' 
       return response.Content.ReadAsStringAsync().ContinueWith<HttpResponseMessage>((read) => 
       { 
        return new HttpResponseMessage(); 
       }); 
      }); 
     } 
} 

答えて

5

364エラーが完全に正常です。一度修正すれば、361エラーも消えます。

ですから、結果Unwrapできます

public Task<HttpResponseMessage> Test() 
{ 
    string url = "http://www.stackoverflow.com"; 
    var client = new HttpClient(); 
    return client.GetAsync(url).ContinueWith(request => 
    { 
     var response = request.Result; 
     response.EnsureSuccessStatusCode(); 
     return response.Content.ReadAsStringAsync().ContinueWith(t => 
     { 
      var result = new HttpResponseMessage(); 
      response.CreateContent(t.Result); 
      return response; 
     }); 
    }).Unwrap(); 
} 
+0

おかげで、私はひどく、戻り値は、各ContinueWidthためのタスク<>に包まれていたことを忘れてしまいました。あなたのコードは今コンパイルされていますが、期待どおりに動作するかどうかはわかりません。クライアントの実行中にスレッドが空き状態になるのはなぜですか?GetAsyncとresponse.Content.ReadAsStringAsyncは呼び出しますか? –

+0

@Tiendq、私は 'Unwrap'を使ってより良い例で私の答えを更新しました。これにより、HTTP要求の実行中に作業スレッドが解放されるようになります。 –

関連する問題