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。。。