1

最初に私のソースコードを見てください:

WebClient client = new WebClient();
String url = "http://localhost";
client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
try
{
    Stream data = client.OpenRead(url);
    if (data == null)
        throw new WebException("Cannot browse the url...");
    StreamReader reader = new StreamReader(data);
    string s = reader.ReadToEnd();
    textBox1.Text = s;
    data.Close();
    reader.Close();

}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}  

アプリケーションを実行すると、この操作中にフリーズします。
私のコードのどの部分が間違っていますか?

4

2 に答える 2

5

私のコードのどの部分が間違っていますか?

UI スレッドでブロッキング ネットワーク操作を実行する部分。UI スレッドが応答を待ってブロックされている間、コントロールは再描画できず、UI はイベントに応答できません。

バックグラウンド スレッドでこれを行い、Control.Invoke(WinForms) またはDispatcher.Invoke(WPF) を使用して UI スレッドへのコールバックをマーシャリングする必要があります。詳細については、 Joe Albahari のスレッド ガイドを参照してください。

または、 で非同期操作を使用しWebClientます。

于 2012-06-26T22:41:07.327 に答える
2

それは戻ってきますか?OpenRead無効なURIが渡された場合、おそらく例外がスローされると確信しています。ドキュメントから:

OpenRead メソッドは、アドレス パラメーターで指定されたリソースの内容を読み取るために使用される Stream インスタンスを作成します。このメソッドは、ストリームを開くときにブロックします。ストリームの待機中に実行を続行するには、OpenReadAsync メソッドのいずれかを使用します。

OpenReadつまり、すべてのデータを返すまで現在のスレッドをブロックします。読み取りを非同期で実行する場合は、 を使用しますOpenReadAsync

このメソッドを呼び出すと操作が開始されますが、コードは続行されます。OpenReadCompleted操作が完了すると、応答を処理するコールバック メソッド (そのイベントのハンドラー) が呼び出されます。

于 2012-06-26T22:41:26.143 に答える