【发布时间】:2014-10-20 15:08:23
【问题描述】:
我有大约 500 万个项目要更新。我并不真正关心响应(响应会很好,所以我可以记录它,但如果这会花费我时间,我不想要响应。)话虽如此,这段代码是否经过优化以运行为尽可能快?如果有 500 万个项目,我会冒取消任何任务或超时错误的风险吗?我每秒收到大约 1 或 2 个回复。
var tasks = items.Select(async item =>
{
await Update(CreateUrl(item));
}).ToList();
if (tasks.Any())
{
await Task.WhenAll(tasks);
}
private async Task<HttpResponseMessage> Update(string url)
{
var client = new HttpClient();
var response = await client.SendAsync(url).ConfigureAwait(false);
//log response.
}
更新: 我实际上得到了 TaskCanceledExceptions。我的系统线程用完了吗?我该怎么做才能避免这种情况?
【问题讨论】:
-
我在想,如果您的计划涉及发出 500 万个 HTTP 请求,那么您可能做错了什么。是否没有单独的批量更新 API 或端点可供您使用?
-
@Damien_The_Unbeliever 不幸的是,没有。这是一个 3rd 方 API,他们没有这个功能。
-
如果您每秒收到 2 个响应,您是否考虑过 500 万次更新需要大约 29 天才能完成?
-
@Prabhu:好吧,您可以使用您编写的信号量来避免创建太多请求。尝试对信号量、测试(即配置文件)使用不同的限制,如果您设法获得最佳位置,请使用它,否则瓶颈可能在另一边。
-
@Prabhu 操作系统限制了您可以通过网络设备驱动程序执行的并发请求数。您遇到的是可能请求在队列中等待时超时。您可以使用
SemaphoreSlim限制工作,或查看TPL Dataflow
标签: c# .net multithreading asynchronous async-await