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