控制台应用中的计时器

时间:2015-04-21 07:56:19

标签: c# timer compact-framework

我正在使用.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时不能正常工作。

2 个答案:

答案 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远离破坏过程。