2016-05-24 7 views
0

WebRequestを使用してHTTPヘッダーの10倍を要求する非同期メソッドを作成しました。 URLが無効である限り、私のプログラムは正常に動作しています。 URLは有効ですが、2つの要求のみが送信されます。HttpWebRequestを使用したデッドロック

これを確認するには、有効なURLを確認するボタンと無効なURLを確認するボタンの2つを作成しました。有効なURLを使用すると、私のカウンタは2だけ増分されますが、初めての場合に限ります。面白いのは、無効なURLのボタンを押しても、期待どおりに動作しているということです。

これは、CSファイルです:これは、XAMLファイル

<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> 

ある

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"); 
    } 
} 

誰かがこのbehavierを説明できますか?

+0

ちなみに、あなたがDispatcher.Invokeは必要ありません。それは待たねばならないものです。 – usr

答えて

0

非同期メソッドのため、デッドロックが予想されていませんでした。私はHttpWebResponseの処理を使わなかったからです。

ここでは、この問題 HttpWebResponse get stuck while running in a loop

にヒントを見つけました。また、それは正確に2倍に取り組んでいた理由、それは、ある説明しました。接続が開いたままのようですし、ConnectionLimitがあります:処分の追加 System.Net.ServicePointManager.DefaultConnectionLimit

は、問題を解決:

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

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

もちろん、問題を解決するために「使用する」を使用することもできます –

関連する問題