使用实体框架时,System.Threading.TimerCallback仅触发一次

Mah*_*ami 1 c# entity-framework timer winforms

我正在开发一个简单的应用程序,该应用程序每60秒检查一次数据库。我曾经System.Threading.TimerCallback这样做,但是,当我运行该应用程序时,它只会滴答一次。

这是代码:

private void Form1_Load(object sender, EventArgs e)
    {
        // Create the delegate for the Timer type. 
        System.Threading.TimerCallback timeCB = new System.Threading.TimerCallback(d);

        // Establish timer settings. 
        System.Threading.Timer t = new System.Threading.Timer(
          timeCB,     // The TimerCallback delegate object. 
          null,       // Any info to pass into the called method (null for no info). 
          0,          // Amount of time to wait before starting (in milliseconds). 
          1000);      // Interval of time between calls (in milliseconds). 
    }

    void m(object o)
    {
        System.Media.SystemSounds.Hand.Play();
        SReminderEntities ctx = new SReminderEntities();

        var jobs = (from m in ctx.Messages
                    select m).ToList();

        var seljobs = from j in jobs
                      where j.RemindeTime.Date == DateTime.Now.Date
                            && j.RemindeTime.Hour == DateTime.Now.Hour
                            && j.RemindeTime.Minute == DateTime.Now.Minute
                      select j;

        foreach (var j in seljobs)
        {
           // SendGmail("iReminder", j.Text, new string[] { j.User.Email }, "iReminderSender@Gmail.com");
            //this.sendSMS(j.User.Mobile, j.Text);
            System.Media.SystemSounds.Hand.Play();
        }//foreach
    }

    void d(object o)
    {
        MessageBox.Show("Test");
    }
Run Code Online (Sandbox Code Playgroud)

当我打电话给d它时,它m只能运行一次。有什么问题,我该如何解决?谢谢。

Pet*_*iho 5

System.Threading.Timer类需要您维护自己的引用。它本身没有任何根数据结构可以使实例可访问。因此,如果您自己不保留引用,则垃圾收集器将回收该对象,并丢弃您的计时器。

尝试在表单类中创建一个私有实例字段,然后将引用存储在那里。

另请参阅文档,该文档的内容为:

只要您使用计时器,就必须保留对其的引用。与任何托管对象一样,如果没有对计时器的引用,则计时器将进行垃圾回收。计时器仍处于活动状态并不妨碍其被收集。