2017-07-16 13 views
0

私は実際にスレッドを停止するhttpWebResponseの問題に直面しています。GetResponse()とWebException私のスレッドを殺す

私は2秒ごとにループスレッドでApiCallメソッドを呼び出します。これはほとんどの場合に有効です。しかし、ときにはrequest.GetResponse()がWebExceptionをスローし、メインスレッドループを停止します。アプリケーションをクラッシュさせずにフリーズします。正常に動作せずに5回(MaxRetries)再試行できます。私は何が起こっているのか分からない。

ここにApiCallメソッドのコード部分があります。私は本当にそれが誰であるかわからない。だから、ここでいくつかのコードを拾った。私は何かを忘れる必要があります...しかし、何ですか?

public T CallWithJsonResponse<T>(string uri, bool hasEffects, params Tuple<string, string>[] headers) 
    { 
     if (simulate && hasEffects) 
     { 
      Debug.WriteLine("(simulated)" + GetCallDetails(uri)); 
      return default(T); 
     } 

     Debug.WriteLine(GetCallDetails(uri)); 
     var request = HttpWebRequest.CreateHttp(uri); 
     foreach (var header in headers) 
     { 
      request.Headers.Add(header.Item1, header.Item2); 
     } 
     HttpWebResponse response = null; 
     request.Timeout = 300000; 

     for (int i = 0; i < MaxRetries; i++) 
     { 

      try 
      { 
       response = null; 
       using (response = (HttpWebResponse)request.GetResponse()) 
       { 
        if (response.StatusCode == HttpStatusCode.OK) 
        { 
         try 
         { 
          using (var sr = new StreamReader(response.GetResponseStream())) 
          { 
           var content = sr.ReadToEnd(); 
           var jsonResponse = JsonConvert.DeserializeObject<ApiCallResponse<T>>(content); 
           sr.Close(); 
           response.Close(); 

           if (jsonResponse.success) 
           { 
            //GC.Collect(); 
            GC.WaitForPendingFinalizers(); 
            return jsonResponse.result; 
           } 
           else 
           { 

            Console.WriteLine(new Exception(jsonResponse.message.ToString())); 

           } 
          } 
         } 
         catch (Exception ex) 
         { 

          Console.WriteLine("Error - Call Details=" + GetCallDetails(uri) + "Exeption: " + ex.ToString()); 

         } 
        } 
        else 
        { 
         Console.WriteLine("Error - StatusCode=" + response.StatusCode + " Call Details=" + GetCallDetails(uri)); 

        } 
       } 
      } 
      catch (WebException wex) 
      { 
       if (wex.Response != null) 
       { 
        Console.WriteLine("ERROR (web exception, response generated): " + Environment.NewLine + new StreamReader(wex.Response.GetResponseStream()).ReadToEnd()); 
       } 
       else 
       { 
        Console.WriteLine("ERROR (web exception, NO RESPONSE): " + wex.Message + wex.StackTrace); 
       } 
       Console.WriteLine("Error - Call Details=" + GetCallDetails(uri)); 

      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("Error - Call Details=" + GetCallDetails(uri) + "Exception: " + ex.ToString()); 
      } 
     } 
     return default(T); 
    } 

private static string GetCallDetails(string uri) 
    { 
     StringBuilder sb = new StringBuilder(); 
     var u = new Uri(uri); 
     sb.Append(u.AbsolutePath); 
     if (u.Query.StartsWith("?")) 
     { 
      var queryParameters = u.Query.Substring(1).Split('&'); 
      foreach (var p in queryParameters) 
      { 
       if (!(p.ToLower().StartsWith("api") || p.ToLower().StartsWith("nonce"))) 
       { 
        var kv = p.Split('='); 
        if (kv.Length == 2) 
        { 
         if (sb.Length != 0) 
         { 
          sb.Append(", "); 
         } 

         sb.Append(kv[0]).Append(" = ").Append(kv[1]); 
        } 
       } 
      } 
     } 
     return sb.ToString(); 
    } 
+0

あなたは何の問題を抱えているのか、あなたの質問は何かわかりません。 – mjwills

+0

投稿を更新して、 'GetCallDetails'メソッドのソースコードを追加してください。 – mjwills

+0

まあ、WebExceptionが発生した後にコードが実行され続けるようにします。しかし、WebExceptionは、現在のスレッドを停止し、私のアプリケーションをフリーズするようです。その他の例外は、コンソールにテキストを書き込むだけで、アプリケーションは動作し続けます。 ApiCallは必須ではありません。それが失敗した場合でも、問題ありません。次の試行は次のループで行われます。しかし、WebExceptionの場合、次のループは決して来ません。 – TiB

答えて

0

私が変えることをお勧め:

catch (WebException wex) 
{ 
    if (wex.Response != null) 
    { 
     Console.WriteLine("ERROR (web exception, response generated): " + Environment.NewLine + new StreamReader(wex.Response.GetResponseStream()).ReadToEnd()); 
    } 
    else 
    { 
     Console.WriteLine("ERROR (web exception, NO RESPONSE): " + wex.Message + wex.StackTrace); 
    } 
    Console.WriteLine("Error - Call Details=" + GetCallDetails(uri)); 

} 

へ:

catch (WebException wex) 
{ 
    try 
    { 
     if (wex.Response != null) 
     { 
      Console.WriteLine("ERROR (web exception, response generated): " + Environment.NewLine + 
           new StreamReader(wex.Response.GetResponseStream()).ReadToEnd()); 
     } 
     else 
     { 
      Console.WriteLine("ERROR (web exception, NO RESPONSE): " + wex.Message + wex.StackTrace); 
     } 
     Console.WriteLine("Error - Call Details=" + GetCallDetails(uri)); 
    } 
    catch (Exception bob) 
    { 
     // Ignore exceptions here 
    } 
} 

はその後 catch (Exception bob)行にブレークポイントを設定する - 既存のcatchブロックが失敗している理由は。

+0

ありがとう、私はそれを試してみましょう。 – TiB

0

まあ、それは正常に動作しているように、私はあなたがスペンダーと言ったようなあらゆる反応を消費しようとしました。 そして、私はあなたがmjwillsと言ったようにtry catchをWebException catchの中に入れますが、決して捕まえません。だから私はすべての反応を消費することが私の問題の解決策だと思う。ありがとうございました !今、アプリケーションが堅牢であるかどうかを確認するために、アプリケーションを1週間監視する必要があります。

0

いいえ...変更されていません。 WebExceptionが発生した後もスレッドがまだ生存しているかどうかを確認するための小さなメソッドを作成しました。そして、何を推測する! try/catchが正常に動作し、WebExceptionが発生します。しかし、ほんの数分後、スレッドが停止またはクラッシュします。魔法使いが正しいかどうかわからない...スレッドが殺された場合、自動再起動を実装しました...非常に醜いですが、うまくいきます。

このリクエストで何が起こっていますか.GetResponse()?なぜ例外がキャッチされてもスレッドを殺すのはなぜですか?それは非常に奇妙です...

関連する問題