使用Entity Framework时,System.Threading.TimerCallback仅触发一次。

3
我正在开发一个简单的应用程序,每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");
    }

当我调用d时,它可以正常工作,但m只运行了一次。出现了什么问题,我该如何解决?谢谢。

删除除计时器之外的所有代码。在tick处理程序中添加一个MessageBox。它是否仍然只触发一次? - usr
2个回答

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

尝试在窗体类中创建一个私有实例字段,并将引用存储在那里。

另请参阅文档,其中部分内容如下:

只要使用计时器,就必须保留对其的引用。与任何托管对象一样,当没有引用时,计时器会受到垃圾回收的影响。计时器仍处于活动状态并不会防止其被收集。


0

一旦 Form_Load 完成,它就会自行清理。您需要在 Form 级别创建一个 Timer 对象的引用,并在 Form_Load 上重新构造它,并传入所需的参数。

System.Threading.Timer t = System.Threading.Timer    

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. 
              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
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接