HttpClient – 任务被取消 – 如何得到确切的错误信息?
我有以下testing代码。 循环316934或361992次后,我总是得到“任务被取消”错误。
如果我没有错,有两个可能的原因为什么取消任务a)HttpClient超时或b)队列中的任务太多,有些任务超时。
我找不到排队任务的限制文档。 我试图创build超过500K的任务,并没有超时。 我猜“b”的原因可能不对。
Q1。 还有其他的原因,我错过了吗?
Q2。 如果是因为HttpClient超时,我怎么才能得到确切的exception消息,而不是“TaskCancellation”exception。
Q3。 什么是解决这个问题的最好方法? 我应该介绍一下节stream器吗?
谢谢!
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中创build一个控制台项目。
-
请复制并粘贴我的代码在主。
-
把断点放在这一行“log.ErrorException(string.Format(”SoeHtike {0}“,Task.CurrentId),ex);”
在debugging模式下运行程序。 等几分钟。 (也许5分钟?)我刚刚testing我的代码,并在3分钟后得到exception。 如果你有提琴手,你可以监视请求,这样你就知道程序仍在运行。
随时让我知道,如果你不能复制的问题。
默认的HttpClient.Timeout
值是100秒(00:01:40)。 如果你在catch
块中做一个时间戳,你会注意到那个时候任务开始被取消。 显然,每秒可以执行的HTTP请求数量有限,其他人则排队。 排队的请求在超时时被取消。 在所有60万个任务中,我个人只有2500个成功,其他人被取消了。
我也觉得不可能,你将能够运行整个60万个任务。 许多networking驱动程序只允许一小段时间通过大量的请求,并在一段时间后将该数量降低到非常低的值。 我的网卡允许我在36秒内只发送921个请求,并将其速度降低到每秒只有一个请求。 以这样的速度完成所有任务将需要一个星期的时间。
如果您能够绕过这个限制,请确保您构build64位平台的代码,因为应用程序非常渴望内存。
不要处理你正在使用的HttpClient的实例。 奇怪,但为我解决这个问题。
只是想分享我有一个类似的代码来加载testing我们的服务器,并且很有可能您的请求超时。 您可以将您的http请求的超时设置为最大,并查看是否为您更改了任何内容。 我尝试通过创build各种线程来打我们的服务器。 它增加了命中,但它们都会最终超时。而且当你在另一个线程上命中时,你也不能设置超时。