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