c# - 如何在异步任务 C# 中限制每秒请求

标签 c# asynchronous task azure-cosmosdb

我正在编写一个与 Azure Cosmos DB 交互的应用程序。我需要在一个 session 中向 CosmosDB 提交 30,000 条记录。因为我使用.NET Core所以我不能使用BulkInsert dll。因此,我使用 Foreach 循环插入到 CosmosDB。但我发现每秒请求太多,并且超出了 CosmosDB 的 RU 限制。

foreach(item in listNeedInsert){
      await RequestInsertToCosmosDB(item);
}

我想在请求数量达到 100 时暂停 foreach 循环。完成 100 个请求后。 foreach 将继续。

最佳答案

您可以对列表进行分区并等待结果:

var tasks = new List<Task>();

foreach(item in listNeedInsert)
{
    var task = RequestInsertToCosmosDB(item);
    tasks.Add(task);

    if(tasks.Count == 100)
    {
        await Task.WhenAll(tasks);
        tasks.Clear();
    }
}

// Wait for anything left to finish
await Task.WhenAll(tasks);

每次运行 100 个任务时,代码都会等待它们全部完成,然后再执行最后一批。

关于c# - 如何在异步任务 C# 中限制每秒请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56151201/

相关文章:

c# - 缺少 Visual Studio for Mac 的 Blazor WebAssembly 应用模板

c# - 对于给定的单词,计算可能的字谜词的数量

javascript - 异步Ajax,具体是怎么回事?

java - 如何在 JUnit 中等待 @JMSListener 注解的方法完成

c# - 路径中的非法字符 : Visual Studio 2019

c# - 如何调试 Task.Factory

html - 异步 Ajax 与异步属性

time - 如何测量 npm/yarn 任务/脚本的执行时间?

JavaFX : How can I use correctly a ProgressIndicator in JavaFX

java - 从任务中关闭 JavaFx 中的阶段