ボタンがクリックされたときにキックされる単純な非同期操作を作成しました。これが全体のコードです。
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
}
private async void Button_Click_1(object sender, RoutedEventArgs e) {
var htmlString = await DowloadPage("http://example.com");
txtBlock1.Text = htmlString;
}
public async Task<string> DowloadPage(string uri) {
using (WebClient client = new WebClient()) {
var htmlString = await client.DownloadStringTaskAsync(uri);
return htmlString;
}
}
}
非常に簡単。しかし、ボタンをクリックすると、UIスレッドが反応しなくなります。ページのダウンロード中にウィンドウを移動しようとすると、できません。
何がうまくいかないのですか?
編集する
私は.NET 4.5でHttpClientを試してみましたが、予想通りかなりうまくいきました。
public async Task<string> DowloadPage(string uri) {
using (HttpClient client = new HttpClient()) {
var response = await client.GetAsync(uri);
var htmlString = await response.Content.ReadAsStringAsync();
return htmlString;
}
}
WebClient
用途HttpWebRequest
残念ながら非同期ではありませんたとえあなたが "非同期"メソッドを使ったとしても。少なくとも、ブロッキングDNSルックアップを行います。プロキシネゴシエーションおよび/または最初のHTTP接続中にもブロックされる可能性があります。
の古いリリースHttpClient
ただラッパーを使っていたHttpWebRequest
。私本当に非同期を要求しましたHttpClient
しかし、応答を聞いたことがない。私が最後にチェックした時HttpClient
それはまだMVCの一部でした。当時ASP.NET Web APIは登場していなかったため、修正された可能性がありますHttpClient
それ以来。または間の動作の違いWebClient
そしてHttpClient
あなたのマシンではDNSキャッシュなどと関係があるかもしれません。
HttpClient
- >HttpWebRequest
- >ServicePoint
- > DNS要求をブロックします。 - Stephen Cleary
async
/await
。 - dtbhtmlString
?レンダリングに時間がかかることがあります。txtBlock1
それと。 - dtbWebClient
そのブロッキングを引き起こすだろうか? - tugberkWebClient
インスタンスは本当に軽量です。どのくらいチェックしましたかhtmlString
(上記の私のコメントを参照)ですか? - dtb