我需要为导入文件实现多线程后台作业。
我已经通过后台作业(Hangfire)实现了它。但如果我使用一个线程,它会变得非常慢。
该函数看起来像这样。
我使用非事务单元立即保存对数据库的更改。
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();
}
当我尝试将其与生产者-消费者数据流模式一起使用时,会出现问题。我抛出异常“在上一个异步操作完成之前,在此上下文上启动了第二个操作”。
问题是如何在该方法内创建隔离的 DbContext。
请帮我。
事务不应该是多线程的。如果在 UOW 中创建新任务/线程,则可以在 using 块中使用 IUnitOfWork.Begin(TransactionScopeOption.RequiresNew) 创建单独的 UOW。
查看链接
- https://github.com/aspnetboilerplate/aspnetboilerplate/issues/619 https://github.com/aspnetboilerplate/aspnetboilerplate/issues/619
- 实体框架支持多线程吗? https://stackoverflow.com/questions/36854087/does-entity-framework-support-multi-threading
- 实体框架和多线程 https://stackoverflow.com/questions/9099359/entity-framework-and-multi-threading
如果您使用 Microsoft SQL Server,那么我建议您使用批量插入。它比实体框架超级快。
https://learn.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql https://learn.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)