ボタンがクリックされたときにキックされる単純な非同期操作を作成しました。これが全体のコードです。
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