2016-05-24 9 views
0

Ich machte eine asynchrone Methode, die 10 mal einen HTTP-Header mit WebRequest anfordert. Solange die URL ungültig ist, funktioniert mein Programm gut. Ist die URL gültig, werden nur zwei Anfragen gesendet.Deadlock mit HttpWebRequest

Um dies zu überprüfen, habe ich zwei Buttons erstellt, einen zum Überprüfen der gültigen URL, einen zum Überprüfen einer ungültigen URL. Wenn ich die gültige URL verwende, wird mein Zähler genau um 2 inkrementiert, aber nur das erste Mal. Das Lustige ist, dass ich immer noch den Knopf für die ungültige URL drücken kann und es funktioniert wie erwartet.

Dies ist die cs-Datei:

public partial class MainWindow : Window 
{ 
    int counter = 0; 

    private async Task DoWork(String url) 
    { 
     for (int i = 0; i < 10; i++) 
     { 
      HttpWebRequest request = WebRequest.CreateHttp(url); 
      request.Method = "HEAD"; 
      request.Timeout = 100; 

      HttpWebResponse response = null; 

      try 
      { 
       response = (HttpWebResponse)await request.GetResponseAsync(); 
      } 
      catch(Exception ex) 
      { 

      } 

      counter++; 
      Dispatcher.Invoke(() => label.Content = counter); 
     } 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     DoWork("http://www.google.ch"); 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     DoWork("http://www.adhgfqliehfvufdigvhlnqaernglkjhr.ch"); 
    } 
} 

Dies ist die XAML-Datei

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <Label Name="label" Content="Label" HorizontalAlignment="Left" Margin="78,151,0,0" VerticalAlignment="Top"/> 
     <Button Content="Valid URL" HorizontalAlignment="Left" Margin="64,71,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/> 
     <Button Content="Invalid URL" HorizontalAlignment="Left" Margin="144,71,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/> 
    </Grid> 
</Window> 

Kann jemand diesen behavier erklären?

+0

Fyi, müssen Sie die Dispatcher.Invoke nicht brauchen. Das ist eine nette Sache zu erwarten. – usr

Antwort

0

Das Problem war nicht wie erwartet ein Deadlock wegen der asynchronen Methode. Es liegt daran, dass ich die HttpWebResponse nicht verwendet habe.

Hier fanden wir den Hinweis auf dieses Problem HttpWebResponse get stuck while running in a loop

auch erklärt ist, warum es genau zwei mal arbeiten. Die Verbindung scheint offen zu bleiben und es gibt eine ConnectionLimit: System.Net.ServicePointManager.DefaultConnectionLimit

Hinzufügen dispose das Problem gelöst:

  try 
      { 
       response = (HttpWebResponse)await request.GetResponseAsync(); 
      } 
      catch (Exception ex) 
      { 

      } 
      finally 
      { 
       if (response != null) 
       { 
        response.Dispose(); 
       } 
      } 
+1

natürlich können Sie auch "verwenden", um das Problem zu lösen –