【发布时间】:2013-12-08 04:18:38
【问题描述】:
我的程序有一个工作版本,我的程序的主要部分使用 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);
}
}
谢谢。
【问题讨论】:
-
你能再解释一下这个问题吗?
-
线程计时器 (tmr) 随机停止。 (我在这篇文章中使用的刷新方法与我在程序中使用的相同)。无论如何,我觉得有更好的方法来做到这一点。
-
是的,您更新的示例不会超出范围,因为您在创建它的函数之外保留了对
tmr中的变量tmr的引用。但是,如果您调用Start()不止一次你会失去对第一个计时器的引用,它最终会自行停止。还要注意,你真的应该去看看the .NET naming guidelines,你的函数名真的应该以大写字母开头。 -
@ScottChamberlain 感谢您的帮助。我真的很感激。
标签: c# multithreading timer scope producer