我有一个负责执行两项工作的hangfire服务:
Pending
电子邮件。我正在使用 ASP.NET MVC(5.2.3)和 StructureMap(4.5.1)为创建用于依赖项注入的IoC容器> Hangfire(1.6.19)
流为:
Pending
状态推送到数据库中。
DbContext
从数据库中检索信息)Pending
电子邮件,并使用System.Net.Mail
为每封电子邮件撰写一封电子邮件。这两个作业都可以正常工作,除非有多个作业同时创建电子邮件。
例如::如果前端同时触发了10个作业以生成电子邮件,则该作业将失败,并显示错误:
在先前的异步操作完成之前,第二个操作在此上下文上开始。使用“ await”来确保在此上下文上调用另一个方法之前,所有异步操作都已完成。不保证任何实例成员都是线程安全的。
引发此错误的行正在使用await
,但我认为这是因为有不同的线程同时访问上下文:
var ids = await context.Objects
.Where(x => x.id == clientId && !x.IsDeleted)
.Select(x => x.id)
.ToListAsync();
我已经设置了DbContext尝试使用不同的作用域Transient
和AlwaysUnique
,但是错误仍然存在。
此外,这并不总是在同一行上发生,基本上不会在所涉及的存储库中使用上下文的任何地方发生-如果两个作业同时在同一行上发生。
作业重试,并且每分钟发送一封电子邮件,如果要处理和发送数百封电子邮件,这可能不起作用(在我的情况下,这是问题所在)