如何在使用HttpWebRequest时阻止UI冻结?

时间:2015-01-16 04:08:34

标签: c#

我的表单上有一个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
   }
}

2 个答案:

答案 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 .

中进行检查