Я пытаюсь найти наилучший из возможных подходов к синхронному запуску метода C # параллельно. Для этого я выбрал Task.Run()
внутри цикла foreach. т.е. добавьте все синхронные методы к задачам и используйте Task.WhenAll(tasks).Wait()
для параллельного выполнения всех задач.
Извините, если я использую Task
без его фактического назначения. Я делаю это, потому что DBContext
НЕ является потокобезопасным, и у меня есть Mandatory
, чтобы использовать один DBContext для каждой записи транзакции / БД. Поэтому я подумал, что делать мой метод async
бесполезно, так как все задачи, которые я выполняю внутри метода, зависят друг от друга. Итак, я подумал, что лучше выполнить список тех же задач одновременно.
ПРИМЕЧАНИЕ. Я запустил эту программу и вижу, что задачи выполняются параллельно без каких-либо проблем, а созданные записи не являются последовательными. Итак, подтверждено, что задачи могут быть параллельными.
Пожалуйста, помогите мне подсказать, в порядке ли моя реализация в долгосрочной перспективе.
Код
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";
}