C# 当我试图获取URL的内容时,应用程序冻结

C# 当我试图获取URL的内容时,应用程序冻结,c#,http,C#,Http,首先查看我的源代码: 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 ==

首先查看我的源代码:

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);
}  
当我运行应用程序时,它将在此操作期间冻结。 我的代码哪部分是错的

我的代码哪部分是错的

在UI线程中执行阻塞网络操作的部分。当UI线程被阻止等待响应时,控件无法重新绘制,UI也无法响应事件

您应该在后台线程中执行此操作,然后使用WinForms或WPF封送回调到UI线程。有关更多信息,请参阅

或者,在WebClient上使用异步操作

我的代码哪部分是错的

在UI线程中执行阻塞网络操作的部分。当UI线程被阻止等待响应时,控件无法重新绘制,UI也无法响应事件

您应该在后台线程中执行此操作,然后使用WinForms或WPF封送回调到UI线程。有关更多信息,请参阅


或者,在WebClient上使用异步操作。

它是否会返回?我确信它可能会这样做,因为如果传递了无效的URI,OpenRead将抛出异常。从文档中:

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

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


调用此方法时,操作将开始,但代码将继续。当操作完成时,回调方法将被调用,其事件处理程序将处理响应。

它是否会返回?我确信它可能会这样做,因为如果传递了无效的URI,OpenRead将抛出异常。从文档中:

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

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


调用此方法时,操作将开始,但代码将继续。当操作完成时,回调方法将被调用,其事件处理程序将处理响应。

定义冻结?您指的是程序方法如何阻塞直到.ReadToEnd返回?是否引发异常?定义冻结?您指的是程序方法如何阻塞直到.ReadToEnd返回?是否引发异常?Tnx很多。对不起,你能解释更多关于WebClient上的异步操作吗?@Programmersinan:我现在没有时间,但请先看看WebClient.DownloadStringAsync…Tnx很多。对不起,你能解释更多关于WebClient上的异步操作吗?@Programmersinan:我现在没有时间,但请先看看WebClient.DownloadStringAsync。。。