3

ボタンをクリックするとキックされる単純な非同期操作を作成しました。コード全体は次のとおりです。

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;   
    }
}
4

1 に答える 1

5

WebClientHttpWebRequest残念ながら、「非同期」メソッドを使用したとしても、これはあまり非同期ではありません。少なくとも、ブロッキング DNS ルックアップを行います。また、プロキシ ネゴシエーション中や最初の HTTP 接続中にブロックされることもあります。

の古いリリースでHttpClientは、 の周りにラッパーを使用していましたHttpWebRequest真に非同期のHttpClientをリクエストしましたが、応答がありませんでした。前回確認HttpClientしたときは、まだ MVC の一部でした。ASP.NET Web API はその時点では存在していなかったためHttpClient、その後修正された可能性があります。または、 と の動作の違いは、DNS キャッシュなどに関係している可能性がWebClientありHttpClientます。

于 2012-04-30T16:15:17.180 に答える