次のテストコードがあります。316934 回または 361992 回ループした後、常に「タスクがキャンセルされました」というエラーが表示されます。
私が間違っていなければ、タスクがキャンセルされた理由として 2 つの可能性があります。
タスクをキューに入れる際の制限に関するドキュメントが見つかりませんでした。そして、500K 以上のタスクを作成してみて、タイムアウトはありませんでした。理由「b」が正しくない可能性があると思います。
Q1. 私が逃した他の理由はありますか?
Q2. HttpClient のタイムアウトが原因である場合、「TaskCancellation」例外の代わりに正確な例外メッセージを取得するにはどうすればよいですか。
Q3. それを修正する最良の方法は何ですか?スロットルを導入する必要がありますか?
ありがとう!
var _httpClient = new HttpClient();
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept", "text/html,application/xhtml+xml,application/xml");
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Encoding", "gzip, deflate");
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:19.0) Gecko/20100101 Firefox/19.0");
_httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Accept-Charset", "ISO-8859-1");
int[] intArray = Enumerable.Range(0, 600000).ToArray();
var results = intArray
.Select(async t => {
using (HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, "http://www.google.com")) {
log.Info(t);
try {
var response = await _httpClient.SendAsync(requestMessage);
var responseContent = await response.Content.ReadAsStringAsync();
return responseContent;
}
catch (Exception ex) {
log.ErrorException(string.Format("SoeHtike {0}", Task.CurrentId), ex);
}
return null;
}
});
Task.WaitAll(results.ToArray());
Console.ReadLine();
問題を再現する手順は次のとおりです。
VS 2012 でコンソール プロジェクトを作成します。
私のコードをコピーしてメインに貼り付けてください。
この行にブレークポイントを置きます " log.ErrorException(string.Format("SoeHtike {0}", Task.CurrentId), ex);"
プログラムをデバッグ モードで実行します。数分待ちます。(おそらく 5 分?) コードをテストしたところ、3 分後に例外が発生しました。フィドラーをお持ちの場合は、リクエストを監視して、プログラムがまだ実行されているかどうかを確認できます。
問題を再現できない場合は、遠慮なくお知らせください。