我使用Compact Framework 2,SP2的C#语言。
设备的操作系统设置为随我的应用程序启动,我们称该应用程序为"Loader.exe"。
Loader只是一个简单的窗体,可以显示加载过程中的状态消息(如果需要),即“出现错误和异常消息”或“启动应用程序[xyz]”,同时在全屏窗体上运行基本的状态机。
因此,Loader窗体的构造函数在末尾添加以下内容:
"RunStateMachine"在与UI不同的线程上运行,允许表单显示,并且每当RunStateMachine需要与表单交互时(例如更新消息),我调用一个函数,该函数使用if(this.InvokeRequired){this.Invoke(...);} else{...}。所以我的问题是什么呢?有时候程序会挂起,这是因为定时器没有触发回调函数。我在上面的try块中添加了调试消息,还有很多其他地方告诉我它停在了哪里,包括在“RunStateMachine”的开始处添加的消息。最终,我的程序挂在了“Starting GUI Init Thread…”消息上。这告诉我线程计时器没有在我需要的时间运行。我的理论是,在计时器触发回调之前,它被垃圾回收了。这意味着如果计时器是全局的,并且在我到达RunStateMachine时显式处理,那么它将完美运行…但我不想认为我解决了这个问题,只是发现它在一个月后偶尔出现。你有什么想法吗?"
设备的操作系统设置为随我的应用程序启动,我们称该应用程序为"Loader.exe"。
Loader只是一个简单的窗体,可以显示加载过程中的状态消息(如果需要),即“出现错误和异常消息”或“启动应用程序[xyz]”,同时在全屏窗体上运行基本的状态机。
因此,Loader窗体的构造函数在末尾添加以下内容:
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){this.Invoke(...);} else{...}。所以我的问题是什么呢?有时候程序会挂起,这是因为定时器没有触发回调函数。我在上面的try块中添加了调试消息,还有很多其他地方告诉我它停在了哪里,包括在“RunStateMachine”的开始处添加的消息。最终,我的程序挂在了“Starting GUI Init Thread…”消息上。这告诉我线程计时器没有在我需要的时间运行。我的理论是,在计时器触发回调之前,它被垃圾回收了。这意味着如果计时器是全局的,并且在我到达RunStateMachine时显式处理,那么它将完美运行…但我不想认为我解决了这个问题,只是发现它在一个月后偶尔出现。你有什么想法吗?"