我有一个我的程序的工作版本,我的程序的主要部分使用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);
}
}
感谢。
答案 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