我有一个控制台应用程序,它通过 HTTP 执行多个 API 请求。
当在单线程中运行时,它每秒最多可以执行大约 8 个 API 请求。
接收 API 调用的服务器拥有大量可用资源,因此它应该能够处理超过 8 个/秒的请求。
此外,当我运行应用程序的多个实例时,每个实例仍然能够每秒执行 8 个请求。
我尝试使用以下代码来并行化请求,但它仍然同步运行:
var taskList = new List<Task<string>>();
for (int i = 0; i < 10000; i++)
{
string threadNumber = i.ToString();
Task<string> task = Task<string>.Factory.StartNew(() => apiRequest(requestData));
taskList.Add(task);
}
foreach (var task in taskList)
{
Console.WriteLine(task.Result);
}
我在这里做错了什么?
编辑: 我的错误是迭代任务并获取task.Result,这阻塞了主线程,让我认为它正在同步运行。
我最终使用的代码而不是 foreach(taskList 中的 var task):
while (taskList.Count > 0)
{
Task.WaitAny();
// Gets tasks in RanToCompletion or Faulted state
var finishedTasks = GetFinishedTasks(taskList);
foreach (Task<string> finishedTask in finishedTasks)
{
Console.WriteLine(finishedTask.Result);
taskList.Remove(finishedTask);
}
}
最佳答案
可能发生了一些事情。
首先,.net ServicePoint
类默认允许每个主机最多有 2 个连接。请参阅this Stack Overflow question/answer .
其次,理论上您的服务器可能能够处理超过 8 个/秒的数据,但服务器端可能存在资源限制或其他问题。我遇到了 API 调用的问题,理论上这些调用应该能够处理比实际更多的事情,但无论出于何种原因,设计或实现不当。
关于c# - 在控制台应用程序中同步运行的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32252328/