我有以下测试代码。循环 316934 或 361992 次后,我总是收到“任务已取消”错误。
如果我没记错的话,取消任务有两个可能的原因:a) HttpClient 超时或 b) 队列中的任务太多,某些任务超时。
我找不到有关排队任务限制的文档。我尝试创建超过 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 中创建一个控制台项目。
请将我的代码复制并粘贴到 Main。
将断点放在这一行“ log.ErrorException(string.Format("SoeHtike {0}", Task.CurrentId), ex);"
在调试模式下运行程序。等待几分钟。(也许 5 分钟?)我刚刚测试了我的代码,3 分钟后我得到了异常。如果您有提琴手,您可以监视请求,以便您知道程序是否仍在运行。
如果您无法复制该问题,请随时告诉我。