HttpClient(C#)在许多异步请求上失败了吗?
我正在使用HttpClient异步向外部api发出许多请求。 我等待所有请求完成,然后在其他代码中使用响应。 我的问题是,如果我发出太多请求,当我使用Task.WhenAll等待时,我的代码会引发exception。
这段代码最终将并行运行,我的意思是我将同时执行多组这些异步请求(即10组200个异步请求)。 我已经实例化了一个HttpClient,我正在使用.NET 4.5异步/等待修饰符,如下所示:
using (var client = new HttpClient()) { // make a list of tasks List<Task> taskList; List replies; for (int i = 0; i < MAX_NUMBER_REQUESTS; i++) { taskList.Add(client.GetAsync(externalUri); } List 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(reader.ReadToEnd())); reader.Close(); } foreach (var reply in replies) { // do something with the response from the external api call... } }
我一直得到一个TaskCanceledException。 在调查之后,我看到这可能是一个超时问题。 我不知道如何解决它。 在尝试使用Task.WhenAll并重复之前,我试图在100个请求中批量处理我的请求。 然后,当我与三组100个请求失败并行运行时。 我错过了什么,有没有人对此有任何见解?
调整ServicePointManager.DefaultConnectionLimit
。 对于大规模并发请求,您只需将其设置为int.MaxValue
。
TaskCanceledException
可能是由于您的HttpClient
在您的相关请求完成之前被处理。 我怀疑给你exception的代码与你发布的样本不一样,因为它不会编译?
以下工作对我来说很好,最多2000个请求:
using (var client = new HttpClient()) { List> taskList = new List>(); List replies = new List (); for (var i = 0; i < MAX_NUMBER_REQUESTS; ++i) { taskList.Add(client.GetAsync(externalUrl)); } var responses = await Task.WhenAll(taskList); foreach (var m in responses) { using (var reader = new StreamReader(await m.Content.ReadAsStreamAsync())) { replies.Add(JsonConvert.DeserializeObject (reader.ReadToEnd())); } } foreach (var reply in replies) { // TODO: } }
所以,你可能还有其他一些问题,你没有提供足够的细节供任何人弄明白。
除了我使用Parallel.ForEach
评论的问题之外: ForEach
正在阻止,因此您的UI将被阻止。
- 具有复合ViewModel的MVC和entity frameworkHtml.DisplayNameFor
- 强制xslt使用版本2和xslCompiledTransform
- 如何在Windowsapp store应用中读取二进制文件?
- 如何在Windows 8.1应用程序和Windows Phone 8应用程序中使用SOAP?
- 使用工作线程对项目进行排队
- C#Concurrency – 长期运行任务的首选方法
- 如何使用CallerMemberName属性更改ILoggerFacade实现以跟踪调用方法?
- .NET 4.5 HttpClient请求ServicePoint
- ReactiveUI 5.0.2中缺少ReactiveAsyncCommand