我的表单上有一个progressBar和一个按钮。 当用户单击此按钮时,progressBar应设置为“marquee”,程序开始检查URL是否有效.. OK。
但是当我点击按钮时,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
}
}
答案 0 :(得分:1)
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
。
答案 1 :(得分:0)
简单地说就是这个:
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 .