System.Threading.Timer无法启动?(System.Threading.Timer

2019-09-23 10:25发布

我使用C#与Compact Framework的2,SP2。

该设备的操作系统被设置为我的申请启动,让我们称之为应用“Loader.exe是。”

装载机很简单:一个单一的,纯的形式,显示在整个负载状态信息,如果必要的话(通俗地说用于有作为一个错误和异常信息,或“起始应用[XYZ]”),和一个状态机在后台运行虽然示出了基本全屏的形式。

所以装载机的形式的构造函数最后如下:

try
{
    label1.Text = "Starting GUI Init Thread...";  //debug only message
    System.Threading.Timer guiInit = new System.Threading.Timer(
        RunStateMachine, null, 2000, System.Threading.Timeout.Infinite
        );
    //callback: RunStateMachine, null argument
    //initial callback is 2000ms from this point, and doesn't run again.
}
catch (Exception ex1)
{
    label1.Text = "GUI Init Error 2";
    Failure_Label.Text = ex1.Message;
}

而“RunStateMachine”不工作在不同的线程比UI,使形式显示,并且任何时候RunStateMachine需要与形式交互,比如更新的消息,我调用使用IF(this.InvokeRequired)函数{这.Invoke(...);}其他{...}

所以,我的问题吗?
间歇性,我的程序将被挂起,这是因为计时器没有触发回调。 我在调试消息加try块以上,与许多其他地方一起告诉我在那里挂了,包括在最开始的消息“RunStateMachine。” 最后,我的程序挂在消息“启动GUI初始化主题...”

这告诉我,线程计时器没有运行一次我需要它。
我的理论是,它被垃圾之前计时器触发回调收集。 这将意味着,如果计时器是全球性的,然后设置明确当我到RunStateMachine,它将完美运行...但我不想觉得我解决了这个问题,只是为了找到这来了间歇一个月从现在开始。

思考?

Answer 1:

我的理论是,它被垃圾之前计时器触发回调收集。 这将意味着,如果计时器是全球性的,然后设置明确当我到RunStateMachine,它将完美运行...但我不想觉得我解决了这个问题,只是为了找到这来了间歇一个月从现在开始。

它看起来像你想的确认,这是你的问题。 是的,这就是问题所在。

定时器存储在其中永远不会再使用过的局部变量。 这使得资格GC。 计时器的GC'ing导致最终确定导致计时器被禁用。

我建议你存储的计时器在你的窗体类的一个实例字段,一旦回调已经解雇从那里删除它。



文章来源: System.Threading.Timer Not Starting?