我想让计时器在每60秒运行一次method()的服务器上运行现在我已经完成了-使用以下代码public class Alarm{ public Alarm(AppDbContext _db) { db = _db; } private static Timer aTimer; private AppDbContext db; public void StartTimerEvent() { // Create a timer and set a 60 second interval. aTimer = new Timer(); aTimer.Interval = 60000; // Hook up the Elapsed event for the timer. aTimer.Elapsed += (source, e) => CheckDBEvents(source, e); // Have the timer fire repeated events (true is the default) aTimer.AutoReset = true; // Start the timer aTimer.Enabled = true; } private void CheckDBEvents(Object source, ElapsedEventArgs e) { //get data from db with matching queries List<Grocery> DataList = db.Grocery.Where(G => G.basic).Select(G => new Grocery { Id = G.Id, Timeout = G.Timeout }).ToList(); }}method()是CheckDBEvents(),它的作用是访问dbcontext实例,并寻找一些数据保存到本地常量变量Called DataList中。问题:每次我尝试将上下文(Dbcontext)实例(在控制器或任何其他类中)传递给CheckDBEvents()方法时,都会处理该上下文-DbContext Disposed Exception。呼叫者,召集者var t = new Alarm(db);t.StartTimerEvent();我的轮胎:-使警报成为静态类:现在,如果我能够做到这一点,那将是惊人的……但是无法在DbContext上进行操作,因为您无法在静态类中调用DbContext上的实例,因此您必须将其传递给调用它的人,这会导致相同的问题: db已处置且未通过 public static void StartTimerEvent(AppDbContext db) { ..... // Hook up the Elapsed event for the timer. aTimer.Elapsed += (source, e) => CheckDBEvents(source, e, db //DbContext is Disposed here and //don't get passed' );而且常量类和Dbcontext与我所阅读的内容相处得不太好。长话短说 -我想保留的DbContext实例在另一个阶级,而不是控制器。没有被处置。如果有人知道如何执行此操作或有服务器端计时器的源代码或类似的内容,请发表评论,我被困了2天
2 回答
猛跑小猪
TA贡献1858条经验 获得超8个赞
我会厌倦将DbContext直接注入到托管服务中。
我的建议是注射IServiceScopeFactory。并且每次您的警报响起时,都创建一个作用域,并仅针对该CheckDBEvents操作解析DbContext 。
甚至您与其他问题的链接也建议您这样做。这样,您可以更优雅地管理DbContext生存期。
像这样的东西:
var scope = serviceFactory.CreateScope();
await using var dbContext = scope.ServiceProvider.GetService<MyDbContext>();
- 2 回答
- 0 关注
- 167 浏览
添加回答
举报
0/150
提交
取消