2015-01-16 54 views
0

我的表单上有一个progressBar按钮。 当用户点击这个按钮时,progressBar应该被设置为“marquee”并且程序开始检查URL是否有效..好吧。如何在使用HttpWebRequest时防止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

检查你应该使用异步方法: http://stackoverflow.com/questions/202481/how-to -use-httpwebrequest-net-asynchronously – Szer

+0

使用'HttpWebRequest.BeginGetResponse()'。看看这里:http://stackoverflow.com/questions/202481/how-to-use-httpwebrequest-net-asynchronously – Icemanind

+0

http://msdn.microsoft.com/en-us/library/system.net.webrequest.getresponseasync (v = vs.110).aspx – Bharadwaj

回答

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

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 .