c# - 在控制台应用程序中同步运行的任务

标签 c# multithreading task-parallel-library asp.net-web-api

我有一个控制台应用程序,它通过 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/

相关文章:

javascript - 如何在 Session 变量中获取 anchor 文本?

android - Looper 线程上的 CoroutineDispatcher

c# - 可以在非后台线程中启动任务吗?

c# - 多个等待与 Task.WaitAll - 等价?

c# - 如何使用异步/并行处理迭代执行深度优先搜索?

c# - OpenXML - 如何将电子表格文档保存到流中?

c# - 术语 "reference"的起源与 "pass-by-reference"

c# - 在 wcf 的客户端禁用证书验证

c# - 访问 GUI 元素未按预期工作

python - Python UNO和线程