【发布时间】:2014-02-04 16:36:10
【问题描述】:
我正在使用 HttpClient 异步向外部 api 发出许多请求。我等待所有请求完成,然后在其他代码中使用响应。我的问题是,如果我发出太多请求,当我使用 Task.WhenAll 等待时,我的代码会抛出异常。
此代码最终将并行运行,我的意思是我将同时执行多组这些异步请求(即 10 组 200 个异步请求)。我已经实例化了一个与 .NET 4.5 async/await 修饰符一起使用的 HttpClient,如下所示:
using (var client = new HttpClient())
{
// make a list of tasks
List<Task<HttpResponseMessage>> taskList;
List<MyData> replies;
for (int i = 0; i < MAX_NUMBER_REQUESTS; i++)
{
taskList.Add(client.GetAsync(externalUri);
}
List<HttpResponseMessage> responses = await Task.WhenAll(taskList);
// read each response after they have returned
foreach (var response in responses)
{
var reader = new System.IO.StreamReader(await response.Content.ReadAsStreamAsync());
replies.Add(JsonConvert.DeserializeObject<MyData>(reader.ReadToEnd()));
reader.Close();
}
foreach (var reply in replies)
{
// do something with the response from the external api call...
}
}
我不断收到 TaskCanceledException。在调查了这个之后,我发现这可能是一个超时问题。我不知道如何解决它。在使用 Task.WhenAll 并重复之前,我尝试将我的请求批处理为 100 个请求,这很有效。然后,当我与三组 100 个失败的请求并行运行时。我错过了什么吗,有人对此有任何见解吗?
【问题讨论】:
-
你是如何并行运行这三组的?
-
一个计时器被触发以开始整个过程,然后它在我们数据集中的每个对象上调用一个计时器。然后,我们数据集中的每个对象都会调用此函数,以通过 api 调用检索其数据。如果那还不够清楚,我可以提供伪代码。
-
当您需要限制并发请求时,TPL 数据流与 HttpClient 配合得很好。一次启动数百个请求可能不是一个好主意。
标签: c# asynchronous .net-4.5 dotnet-httpclient async-await