2015-01-16 3 views
0

У меня есть progressBar на моей форме и кнопке. Когда пользователь нажимает на эту кнопку, progressBar следует стилизовать как «выделение», и программа начинает проверять, что URL-адрес действителен или нет. ОК.Как я могу предотвратить зависание пользовательского интерфейса при использовании HttpWebRequest?

Но когда я нажимаю на кнопку, интерфейс замерзает до тех пор, пока HttpStatusCode возвращает истину или ложь ...

Вот код проверки:

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-асинхронно – 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

Пользовательский интерфейс зависает, потому что вы выполняете RemoteFileExists метод в потоке пользовательского интерфейса и получение ответа от HttpWebRequest занимает некоторое время.
Чтобы решить эту проблему, вы должны выполнить 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 .

Смежные вопросы