我正在使用.NET compact framework 2.0创建一个设备应用程序。我的应用程序中有system.threading.timer
执行一些代码。它工作正常。我的问题是,当我通过双击bin文件夹中的exe来运行应用程序时,计时器启动并执行所有工作,但它永远不会停止。即使在通过单击X按钮或从文件菜单关闭按钮关闭应用程序后,它也会在后台运行。我不明白我停止或处理计时器的方式和地点,以便在关闭应用程序后它不会运行。可能类似于窗体表单应用程序中的form_closing事件。我在谷歌搜索了很多,但没有找到合适的答案。
该应用程序用于为设备生成数字输出 这是一些计时器事件的代码:
public static void Main()
{
// Some code related to the device like open device etc
// Then the timer
System.Threading.Timer stt =
new System.Threading.Timer(new TimerCallback(TimerProc), null, 1, 5000);
Thread.CurrentThread.Join();
}
static void TimerProc(Object stateInfo)
{
// It is my local method which will execute in time interval,
// uses to write value to the device
writeDigital(1, 0);
GC.Collect();
}
当我在调试模式下运行代码时工作正常,当我停止程序时计时器停止。但是当我运行exe时不能正常工作。
答案 0 :(得分:1)
您可以在Main()
中创建并处理它并将其传递给任何需要它的方法吗?
private static void Main()
{
using (var timer = new System.Threading.Timer(TimerProc))
{
// Rest of code here...
}
}
更重要的是,这行代码:
Thread.CurrentThread.Join();
将永远不会返回,因为您要求当前线程等待当前线程终止。想一想......;)
所以你的解决方案可能就是删除那行代码。
答案 1 :(得分:0)
所有关于GC.Collect();
您的stt对象被使用一次,然后被指出被删除并回收其内存。
如果你不相信,请调用stt.ToString();在main函数结束时,它会将stt live扩展到main函数的结尾。
将(S)?
您可以将stt对象定义为静态 - 它可以保证它在您的程序生命结束之前一直处于活动状态
推荐的解决方案是使用GC.KeepAlive(stt);你可以在主要功能结束时调用,这将使stt远离破坏过程。