私は実際にスレッドを停止する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();
}
あなたは何の問題を抱えているのか、あなたの質問は何かわかりません。 – mjwills
投稿を更新して、 'GetCallDetails'メソッドのソースコードを追加してください。 – mjwills
まあ、WebExceptionが発生した後にコードが実行され続けるようにします。しかし、WebExceptionは、現在のスレッドを停止し、私のアプリケーションをフリーズするようです。その他の例外は、コンソールにテキストを書き込むだけで、アプリケーションは動作し続けます。 ApiCallは必須ではありません。それが失敗した場合でも、問題ありません。次の試行は次のループで行われます。しかし、WebExceptionの場合、次のループは決して来ません。 – TiB