我正在使用EF Core和Hangfire来运行重复作业。杭火似乎导致以下错误:
在上一个操作之前在此上下文上启动第二个操作 完成。这通常是由不同的线程使用相同的线程引起的 DbContext 的实例。有关如何避免线程的详细信息 数据库上下文的问题
和。。我不知道为什么。我按如下方式注册 EF 上下文:
services
.AddDbContext<PaymentContext>(options => options.UseNpgsql(connectionString),
ServiceLifetime.Transient);
然后。。
app.UseHangfireDashboard();
app.UseHangfireServer();
RecurringJob.AddOrUpdate(() => myService.ExecuteMyJob(), Cron.Minutely);
其中 myService 已注入Startup.Configure
函数,并且 myService 包含对DbContext
的引用。这在理论上是暂时的,因此不应由服务和其他地方共享。
但是,堆栈跟踪导致此处:
var plans = _context.Plan
.Include(pp => pp.PlanItem)
.Where(pp => pp.PolicyId == policyId)
.ToList() // materialise query
.OrderBy(pp => pp.PlanItem.First().Date)
.ToList();
您应该为依赖项创建范围。
public class Job
{
private readonly IServiceProvider _serviceProvider;
public Job(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public void ExecuteJob()
{
using (var scope = serviceProvider.CreateScope())
{
var databaseContext = scope.ServiceProvider.GetRequiredService<DatabaseContext>();
// do something
}
}
}