簡體   English   中英

使用HttpWebRequest時如何防止UI凍結?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM