2011-07-12 14 views
0

Web Api HttpClientを使用して、次の非同期コントローラに関するすべてのフィードバックを送信したいだけです。これは非常に汚れているように見えますが、それを清潔にする方法はありますか?誰もが複数の非同期タスクを連鎖させる良いラッパーを持っていますか?C#Web Api GetAsync + MVC 3.0非同期コントローラ

public class HomeController : AsyncController 
{ 
    public void IndexAsync() 
    { 
     var uri = "http://localhost:3018/service"; 
     var httpClient = new HttpClient(uri); 

     AsyncManager.OutstandingOperations.Increment(2); 
     httpClient.GetAsync(uri).ContinueWith(r => 
     { 
      r.Result.Content.ReadAsAsync<List<string>>().ContinueWith(b => 
      { 
       AsyncManager.Parameters["items"] = b.Result; 
       AsyncManager.OutstandingOperations.Decrement(); 
      }); 
      AsyncManager.OutstandingOperations.Decrement(); 
     }); 
    } 

    public ActionResult IndexCompleted(List<string> items) 
    { 
     return View(items); 
    } 
} 
+0

誰かがアドバイスを持っている場合は、キーワードawaitを参照してください –

答えて

0

多くの非同期呼び出しとAsyncManager.OutstandingOperations.Decrement()を使用しているようです。次のコードは、YQLを使用してFlickr写真情報を非同期に読み込むのに十分です。

public class HomeController : AsyncController 
{ 
    public void IndexAsync() 
    { 
     var uri = "http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20flickr.photos.recent"; 
     var httpClient = new HttpClient(uri); 

     AsyncManager.OutstandingOperations.Increment(); 
     httpClient.GetAsync("").ContinueWith(r => 
      { 
       var xml = XElement.Load(r.Result.Content.ContentReadStream); 

       var owners = from el in xml.Descendants("photo") 
           select (string)el.Attribute("owner"); 

       AsyncManager.Parameters["owners"] = owners; 
       AsyncManager.OutstandingOperations.Decrement(); 
      }); 
    } 

    public ActionResult IndexCompleted(IEnumerable<string> owners) 
    { 
     return View(owners); 
    } 
} 
+0

こんにちはモーリス、私は私の例が非常に単純化しているようです。しかし、2つの長期実行プロセスを連鎖させる必要がある場合はどうなりますか?私はコントローラからこれを抽象化するための良い方法も探しています。このコードは非常に醜く見えにくいです。 –

+0

連鎖非同期呼び出しの場合は、チェーンの最後の部分に単一のAsyncManager.OutstandingOperations.Decrement()が必要です。私は大きな違いはないことを知っています:-(現在のところ、ラムダ式の代わりに関数を使用する標準的なオプションがありますが、C#5では読み書きがもっと簡単になるはずです。 – Maurice

関連する問題