【发布时间】:2014-10-02 12:26:59
【问题描述】:
突然之间,这段通常有效的代码开始抛出 HttpRequestException 错误。在日志中,我看到请求实际上是在引发错误前 1 分 35 秒发送的。会不会是超时问题?
代码如下:
private async Task<HttpResponseMessage> RunRequest(HttpRequestMessage request)
{
var client = new HttpClient();
var response = await client.SendAsync(request).ConfigureAwait(false);
return response;
}
这里是调用者(可能有 10K 到 50K 项):
int counter = 0;
var tasks = items.Select(async i =>
{
if (await RunRequest(CreateRequest(i)))
counter++
}).ToList();
if (tasks.Any())
{
await Task.WhenAll(tasks);
}
这是错误:
System.Net.Http.HttpRequestException: An error occurred while sending the request. ---> System.Net.WebException: The request was aborted: The request was canceled.
at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar)
--- End of inner exception stack trace ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MyClass.<RunRequest>d__c.MoveNext()
--- End of inner exception stack trace ---
at MyClass.<RunRequest>d__c.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at MyClass.<RunRequest>d__0.MoveNext()
Task.WhenAll 可以处理的限制有吗?
【问题讨论】:
-
“突然间……”那么,发生了什么变化?
-
没有什么我能想到的。事实上,这段代码大部分时间都运行良好。这个错误随机出现。一个可能的变化/变量可能是请求的数量。可能有大约 10000 次 RunRequest 调用。
-
每个请求通常需要多长时间?
-
“错误出现在 2 分钟后”:你确定它实际上不是 1 分 40 秒吗?默认超时为 100 秒
-
10000 是 很多 个请求一次性向服务器抛出。你可能想把这些错开一点。
WhenAll没有限制;这几乎肯定是服务器可伸缩性问题(不在您的代码中)。即,如果服务器不是async,它就无法快速响应请求量的突然变化。
标签: c# .net asynchronous async-await dotnet-httpclient