具有DbContext的服务器端计时器

我想让计时器在每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天


繁星点点滴滴
浏览 168回答 2
2回答

猛跑小猪

我会厌倦将DbContext直接注入到托管服务中。我的建议是注射IServiceScopeFactory。并且每次您的警报响起时,都创建一个作用域,并仅针对该CheckDBEvents操作解析DbContext 。甚至您与其他问题的链接也建议您这样做。这样,您可以更优雅地管理DbContext生存期。像这样的东西:var scope = serviceFactory.CreateScope();await using var dbContext = scope.ServiceProvider.GetService<MyDbContext>();
打开App,查看更多内容
随时随地看视频慕课网APP