2012-03-14 17 views
2

私たちには、HttpWebRequestを使用して多くのHTTP呼び出しを行い、データを取得するための大きなライブラリがあります。 HTTPClientで非同期呼び出しを利用するためにこのライブラリを書き直すことはクマになります。ですから、タスクファクトを使用してライブラリに呼び出す非同期コントローラを作成できるかどうか、そしてWebClient経由で最終的に行われる呼び出しが非同期であるか、それともまだ同期しているかどうかは疑問でした。古いHttpWebRequestと非同期を混ぜようとすると、何か問題や副作用がありますか?WebResponseをまだ非同期に呼び出すMVC非同期コントローラはありますか?

+0

'WebClient'は新しいものではなく、少なくとも.Net 1.1以来存在しています。あなたは 'HtppClient'を意味しますか?それは.NET 4.5とASP.NET MVC 4の新機能ですか? – svick

+0

はい、混乱して申し訳ありません。あなたは正しいです、私は新しいHttpClientを意味しました。 – AlexGad

答えて

6

私があなたが何を提案しているか理解しているなら、いいえ、クライアントが話しているサービスを非同期に変更することは役に立たないでしょう。サーバーが非同期であるかどうかに関わらず、I/Oがサーバーと未処理の間にクライアントは依然としてCPUスレッドをブロックします。

HttpWebRequestから切り替える理由はありません。 .NET 4.0でTaskFactory::FromAsyncを使用してHttpWebRequest::BeginGetResponseを呼び出すことができます。 .NET 4.5では

WebRequest myWebRequest = WebRequest.Create("http://www.stackoverflow.com"); 

Task<WebResponse> getResponseTask = Task<WebResponse>.Factory.FromAsync(
               myWebRequest.BeginGetResponse, 
               myWebRequest.EndGetResponse, 
               null); 

getResponseTask.ContinueWith(getResponseAntecedent => 
{ 
    WebResponse webResponse = getResponseAntecedent.Result; 

    Stream webResponseStream = webResponse.GetResponseStream(); 

    // read from stream async too... eventually dispose of it 
}); 

あなたははまだHttpWebRequestを使用し、非常に簡単の一体を生活を作るためにC#で新しいawait機能を備えた新しいGetResponseAsyncメソッドを使用し続けることができます:

それは次のようになります
WebRequest myWebRequest = WebRequest.Create("http://www.stackoverflow.com"); 

using(WebResponse webResponse = await myWebRequest.GetResponseAsync()) 
using(Stream webResponseStream = webResponse.GetResponseStream()) 
{ 
    // read from stream async, etc. 
} 
+0

ああ、ありがとう。コールがまだブロックされていると思ったので、WebRequestが非同期をサポートするように拡張されている可能性はありませんでしたが、確かにメソッドを参照すれば私の答えがわかります。ありがとう! – AlexGad

関連する問題