.NET 4.5のさまざまな非同期機能についてはまだ理解していませんが、何か面白いことに遭遇しました。私のMVCコントローラーで次のことを考えると、(1)と(2)を実行すると異なる結果が得られます
public ActionResult Index() {
var stuff = SomeExpensiveFunction();
return View(stuff);
}
private byte[] SomeExpensiveFunction() {
string url = "http://some-url.../";
// (1)
var wc = new WebClient();
return wc.DownloadDataTaskAsync(url).Result;
// (2)
var hc = new HttpClient();
return hc.GetAsync(url).Result.Content.ReadAsByteArrayAsync().Result;
}
表面上、それらは同じように見えます-とは両方ともWebClient.DownloadDataTaskAsync
をHttpClient.GetAsync
返すasync
メソッドTask
です。WebClient
バージョンが返されるTask<byte[]>
間にHttpClient
バージョンが返さTask<HttpResponseMessage>
れ、バイトを掘り下げる必要がありますが、.Result
どちらの方法でも呼び出しています。これは、関数を終了する前に完了すると予想されます。
(1)を使用すると、。で黄色の画面が表示されAn asynchronous operation cannot be started at this time...
ます。(2)を使用すると、すべてが正常に機能します。
スタック全体を変更しasync
て、コントローラーメソッド自体とを使用できSomeExpensiveFunction
ます。すべてが正常に機能します。しかし、私は(1)に根本的な問題があるのか、それともWebClient
MVCを使用する際の一般的な問題に問題があるのかを理解しようとしています。何かご意見は?
編集:この例では、実際には非同期で何もしていないので、これらの呼び出しの同期バージョンを使用できることを知っています-これは、より大きなコードベースに基づく単なる例です。