C#单独调用计时器上的方法的线程(Timer超出范围)

时间:2013-11-23 06:04:22

标签: c# multithreading timer scope producer

我有一个我的程序的工作版本,我的程序的主要部分使用forms.timer在与GUI相同的线程上运行。

我正在尝试升级到使用2个线程的更好版本。我的一个线程(处理所有信息)需要重复调​​用(在计时器上)。

我正在使用我的主要课程中的以下内容:

Timer tmr = new Timer(new TimerCallback(bot.refresh), null, 0, 1000);

其中bot.refresh是我想要每隔一秒(1000毫秒)调用的方法,直到我停止它。

public void refresh(Object obj)
{
        Debug.WriteLine("Updated: " + DateTime.Now.ToString());
}

大约1/3的计时器将停止运行,我将得到此输出:

Updated: 23/11/2013 4:37:24 PM
Updated: 23/11/2013 4:37:25 PM
Updated: 23/11/2013 4:37:26 PM
Updated: 23/11/2013 4:37:27 PM
Updated: 23/11/2013 4:37:28 PM
Updated: 23/11/2013 4:37:29 PM
Updated: 23/11/2013 4:37:30 PM
The thread '<No Name>' (0x3f20) has exited with code 0 (0x0).
The thread '<No Name>' (0x37a0) has exited with code 0 (0x0).

对于为什么会发生这种情况的任何建议?

另外,有更好的方法吗?我觉得这是一种奇怪的方法。

感谢您的帮助。

编辑:

这会超出范围吗?这样我可以在需要时启动计时器,而不是在构造Main时启动计时器。要引用它是否需要在构造函数中?

class Main
{
    Timer tmr;
    public Main()
    {

    }

    public void start()
    {
         tmr = new Timer (new TimerCallback(bot.refresh), null, 0, 1000);
    }
}

感谢。

1 个答案:

答案 0 :(得分:3)

您的计时器超出范围,最终被垃圾收集并停止运行。你必须保留对它的引用,这样它就不会超出范围。

class MainClass
{
    public MainClass()
    {
        tmr = new Timer(new TimerCallback(bot.refresh), null, 0, 1000);
    }

    Timer tmr;
}

至于处理这个的更好方法,它取决于bot.refresh正在做什么。但是,如果可能的话,我会使用Consumer-Producer模型并拥有第二个线程刚刚处理的“排队工作”集合(这可能对你来说根本不起作用,就像我说的那样取决于{{1工作。)

bot.refesh