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

它会回来吗?我敢肯定,如果传递了无效的 URI,它可能OpenRead会抛出异常。从文档:

OpenRead 方法创建一个 Stream 实例,用于读取 address 参数指定的资源的内容。此方法在打开流时阻塞。要在等待流时继续执行,请使用 OpenReadAsync 方法之一。

OpenRead是同步的,即它阻塞当前线程,直到它返回所有数据。如果您希望异步执行读取,请使用OpenReadAsync.

当您调用此方法时,操作将开始,但您的代码将继续。当操作完成时,将调用一个回调方法(其OpenReadCompleted事件的处理程序),该方法将处理响应。

于 2012-06-26T22:41:26.143 回答