gpt4 book ai didi

c# - 限制并发 System.Threading.Tasks.Task 的数量

转载 作者:行者123 更新时间:2023-11-30 23:18:40 25 4
gpt4 key购买 nike

我需要向我的数据库执行大量数据插入。我可以使用限制并发操作数量的节流调度程序以多线程方式实现代码。在每个 M行,一个 block 被形成并作为一个原子操作插入到数据库中。多个并发操作应该发生,因为数据库比读取和解析数据文件慢。我经常使用多线程来实现这个模型。

如果我决定使用 await/async( Entity Framework 支持异步编程)来实现我的代码,我如何确保不超过 N 个并发任务执行(即转到数据库)同时?

在我最初的设计中,我实例化了一个 List<Task> ,一旦我读取要自动插入的数据 block 就添加了新任务,然后让我的方法在 await 之后返回正在执行所有任务。设计时问题是并发数 Task s(以及内存占用量)将呈爆炸式增长,因为对于大数据文件,任务的输入速度快于完成速度。

我正在考虑使用 SemaphoreSlim ,但我对异步编程的经验很少(与多线程不同)。所以我问这个问题是为了获得有关最佳实践的反馈(如果有的话)。

最佳答案

The design-time issue is that the number of concurrent Tasks (and thus memory footprint) are going to explode because tasks are fed faster than they complete for big data files. I was thinking about using a SemaphoreSlim

是的,SemaphoreSlim 是限制并发异步操作的合适选择:

private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(10);

async Task ThrottledWorkAsync()
{
await _semaphore.WaitAsync();
try
{
await WorkAsync();
}
finally
{
_semaphore.Release();
}
}

然而...

If instead I decide to implement my code using await/async (Entity Framework supports asynchronous programming), how can I make sure that no more than N concurrent tasks execute (i.e. go to database) at the same time?

需要注意的一件事是 Entity Framework - 虽然它支持异步 API - 仍然需要每个请求一个连接。所以,你不能有多个具有相同 DbContext 的并发异步请求;您需要为每个并发请求创建一个单独的连接(或至少 N 个被并发请求“借用”的连接)。

关于c# - 限制并发 System.Threading.Tasks.Task 的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40723104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com