我需要为导入文件实现多线程后台作业。 我已经用后台工作(Hangfire)实现了它。但是,如果我使用一个线程,它会非常慢。 功能看起来像这样。
我使用非事务处理单元立即保存对db的更改。
var contactFound = await _contactRepository.FirstOrDefaultAsync(x => x.Email.ToLower() == contact.Email.ToLower());
if (contactFound != null)
{
await _bjInfoManager.AddLog(args.JobId, "Found duplicated email: " + contact.Email);
}
else
{
contact.ContactListId = args.ContactListId;
contact.Email = contact.Email.ToLower();
await _contactRepository.InsertAsync(contact);
//Save changes in db
await CurrentUnitOfWork.SaveChangesAsync();
}
当我尝试将它与Producer-Consumer Dataflow Pattern一起使用时,会出现问题。我抛出异常"在上一次异步操作完成之前,在此上下文中启动了第二个操作。"
问题是如何在此方法中创建隔离的DbContext。 请帮帮我。
答案 0 :(得分:0)
交易不应该是多线程的。如果在UOW中创建新任务/线程,则可以在using块中使用IUnitOfWork.Begin(TransactionScopeOption.RequiresNew)创建一个分离的UOW。
参见链接
如果您使用的是Microsoft SQL Server,我建议您使用批量插入。它比实体框架快。
https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql