[英]How can I prevent UI freezing while using HttpWebRequest?
我的表单上有一个progressBar和一个按钮。 当用户单击此按钮时,进度条应设置为“字幕”样式,程序开始检查URL是否有效。
但是,当我单击按钮时,UI冻结,直到HttpStatusCode返回true或false。
这是检查代码:
private bool RemoteFileExists(string url)
{
try
{
HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
request.Method = "HEAD";
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
return (response.StatusCode == HttpStatusCode.OK);
}
catch
{
return false;
}
}
这是按钮点击代码:
private async void button1_Click(object sender, EventArgs e)
{
this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
var result = RemoteFileExists("http://www.google.com/");
if (Completed)
{
//ok
}
else
{
//not ok
}
}
UI冻结是因为您正在UI线程上执行RemoteFileExists
方法,并且从HttpWebRequest
接收响应需要一些时间。
为了解决这个问题,您必须在与UI线程不同的线程中执行RemoteFileExists
。
由于您的button1_Click
方法已被声明为async
所以最简单的方法就是也将RemoteFileExists
声明为async
。
然后,您可以使用HttpWebRequest.GetResponseAsync
方法异步接收响应对象。
private async Task<bool> RemoteFileExists(string url)
{
try
{
HttpWebRequest request = WebRequest.CreateHttp(url);
request.Method = "HEAD";
using(var response = (HttpWebResponse) await request.GetResponseAsync())
{
return (response.StatusCode == HttpStatusCode.OK);
}
}
catch
{
return false;
}
}
同样,在处理IDisposable
时,应注意通过使用using
语句或调用Dispose()
释放所有已使用的资源。
如果使用的是.NET Framework 4+,则还可以使用WebRequest.CreateHttp(string)
创建HttpWebRequest
。
简而言之,只需使用以下命令:
private void button1_Click(object sender, EventArgs e)
{
this.progressBar1.Style = System.Windows.Forms.ProgressBarStyle.Marquee;
Thread thread = new Thread(() => RemoteFileExists("http://www.google.com/"));
thread.IsBackground = true;
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
并在RemoteFileExists .
内部进行检查RemoteFileExists .
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.