C# 在foreach循环中使用Task.Run和Synchronous方法

C# 在foreach循环中使用Task.Run和Synchronous方法,c#,task,C#,Task,我正试图找到一种最好的方法来并行运行同步C#method。为此,我在foreach循环中选择了Task.Run()。例如,将所有同步方法添加到任务中,并使用Task.WhenAll(tasks).Wait()并行执行所有任务 抱歉,如果我使用的是任务,而没有实际用途。我这样做是因为DBContext不是线程安全的,而且我必须对每个事务/DB记录使用单个DBContext。因此,我认为使我的方法异步是没有用的,因为我在一个方法中执行的所有任务都是相互依赖的。所以,我认为最好同时运行相同任务的列表

我正试图找到一种最好的方法来并行运行同步C#method。为此,我在foreach循环中选择了
Task.Run()
。例如,将所有同步方法添加到任务中,并使用
Task.WhenAll(tasks).Wait()
并行执行所有任务

抱歉,如果我使用的是
任务
,而没有实际用途。我这样做是因为
DBContext
不是线程安全的,而且我必须
对每个事务/DB记录使用单个DBContext。因此,我认为使我的方法
异步
是没有用的,因为我在一个方法中执行的所有任务都是相互依赖的。所以,我认为最好同时运行相同任务的列表

注意:我运行了这个程序,可以看到任务并行运行,没有任何问题,并且创建的记录不是连续的。因此,它证实了这些任务可以并行

请帮助我建议我的实施是否适合长期使用

代码

    public void MainMethod()
    {
        foreach (var x in _ListUser)
            tasks.Add(Task.Run(() => Update1Record(x)));
        Task.WhenAll(tasks).Wait();
    }
    public string Update1Record(UserViewModel objUser)
    {
        using (var VibrantDbContext = new VIBRANT())
        using (var AuditDb = new VibrantAuditEntities())
        using (var VibrantTransaction = VibrantDbContext.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
        using (var AuditTransaction = AuditDb.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
        {
            try
            {
                VibrantDbContext.Database.Initialize(force: false);
                AuditDb.Database.Initialize(force: false);
                VibrantDbContext.Configuration.AutoDetectChangesEnabled = false;
                var _ObjUserItem = FillupDateTimeValues(objUser);
                ImportToDB(_ObjUserItem, 0, VibrantDbContext, AuditDb);
                BuildImportLog(objUser, VibrantDbContext, AuditDb);
                VibrantDbContext.SaveChanges();
                AuditDb.SaveChanges();
                VibrantTransaction.Commit();
                AuditTransaction.Commit();
            }
            catch (Exception ex)
            {
                VibrantTransaction.Rollback();
                AuditTransaction.Rollback();
                throw;
            }
        }
        return "S";
    }

在这种情况下,您可以使用并行foreach。有关更多信息,请参阅此帖子:


如果您的列表很大,那么您最好使用DB的批量更新/插入。如果您的列表不是太大,那么只使用一个DB连接可能会更好。创建多个连接可能会导致问题,在实际的数据库更新过程中,任何方法都必须锁定数据库table@peeyushsingh:无法进行批量插入/更新,因为我需要为每个数据库条目维护一个事务。为什么不使用
Task.WaitAll
而不是使用
Task.whalll
,这提供了一个代表性的任务为什么每个条目都需要一个事务?我有很多插入。ie、用户、电话、电子邮件、地址。我将所有这些表条目包装到一个事务中。如果导入100条记录,如果1条失败,那么它仍然成功导入499条记录;如果我进行一次500条记录的交易,那么所有记录都将失败,并且没有一条记录存储在数据库中。请不要链接到其他站点作为答案。请将内容放在答案中,并且只提供支持您所展示内容的链接。您至少应提供详细信息,说明如何在OP提供的给定代码中使用此API