C#,EF Core 3,并发性,如何正确实现对SQL数据库的写/读操作的并行处理? 我在一个数据导入项目的中间,我有一个旧的DB,从中提取数据,做很多处理,使它“适合”到新的DB,然后我把它写到新的DB。< /P>

C#,EF Core 3,并发性,如何正确实现对SQL数据库的写/读操作的并行处理? 我在一个数据导入项目的中间,我有一个旧的DB,从中提取数据,做很多处理,使它“适合”到新的DB,然后我把它写到新的DB。< /P>,c#,multithreading,entity-framework,.net-core,parallel-processing,C#,Multithreading,Entity Framework,.net Core,Parallel Processing,我试图加快这个过程,因为我需要处理数以百万计的记录,而单线程过程太慢了。我目前是这样做的: SemaphoreSlim _sem = new SemaphoreSlim(8); var tasks = policyVersionDictionary.Select(async pv => { await _sem.WaitAsync(); await using (var dbThread = new ApplicationDbContext(connectionStr

我试图加快这个过程,因为我需要处理数以百万计的记录,而单线程过程太慢了。我目前是这样做的:

SemaphoreSlim _sem = new SemaphoreSlim(8);

var tasks = policyVersionDictionary.Select(async pv =>
{

    await _sem.WaitAsync();

    await using (var dbThread = new ApplicationDbContext(connectionString))
    {

        try
        {
            dbThread.Database.SetCommandTimeout(240);

            var listOfPolicyVersions = pv.Value;

            var horseService = new HorseTransferServiceMultithreading(dbThread);

            await horseService.ProcessHorse(listOfPolicyVersions);

        }
        finally
        {
            _sem.Release();

            // Probably an overkill as we're inside 'using'
            dbThread.Database.CloseConnection();
            dbThread.Dispose();

        }
    }

}).ToArray();

await Task.WhenAll(tasks);  
\u sem
正在控制线程的数量,我为policyVersionDictionary中的每个项目生成了一个新的dbContext,我也生成了一个新的
HorseTransferServiceMultithreading
,因为我希望它对于每个操作(线程)都是独立的

horseService.ProcessHorse(政策版本列表)
method是一种包装器方法,用于处理每个项目所需的全部处理,包括多次读取/写入数据库

这已经比单线程方式工作得更快了,但我不确定这是否是执行并发/并行处理的正确方式。我读过很多关于当你编写从数据库读写的并行代码时会发生灾难、死锁、错误等等的帖子,但我对这种方法了解不够,无法判断我是做对了还是犯了很大的错误


有更好的办法吗?这应该完全避免吗?如果是这样的话,应该如何处理进口项目以加快速度?目前,它的运行时间约为48小时(不仅仅是这段代码),这相当长,我希望能让它运行得更快。

看起来您正在使用EF。这是对的吗?是的,这是正确的,对不起,我将编辑问题以添加此内容。您还可以添加有关数据库的信息吗?根据我的经验,使用实体框架进行此类批量数据传输是最慢的方法之一。您是否正在转移到“在用”数据库,或者您是否有幸离线执行此操作?我建议1)使用ADO.NET或Dapper而不是EF进行批量读/写;2)采用TPL数据流定义转换管道。