为什么Windows窗体计时器停止工作?

时间:2013-05-31 11:03:38

标签: c# winforms

在我的基于C#的应用程序中,我在我的应用程序中创建了一个新表单,它有自己的System.Forms.Timer对象。我第一次创建表单时一切正常,我收到计时器滴答,没有问题。在某些情况下,我必须杀死表单并创建一个新的(相同的)表单对象。表单以类似方式创建。表格已正确加载,计时器已正确初始化,但计时器未勾选。我尝试了不同的方法,如停止和处理计时器对象,并在FormLoad中创建一个新的方法,但徒劳无功。我的朋友建议我的新表单对象可能不会收到Windows计时器消息(WM_TIMER)。如何在新的表单对象中检查消息循环是否正常工作?我做错了什么?

简而言之,重新创建表单对象会以某种方式禁用计时器滴答。请指教。

代码充满了反思并展开。我将尝试尽可能多地发布。

创建新表单对象的代码

Form f = ReflectUtils.CreateClassFromAssembly( _TheAssembly, FormName ) as Form;
if ( null == f )
{
    throw new ApplicationException( "Failed to create Form: {");
}
_GUICancelEventHandler = new CancelEventHandler( GUIControlForm_Cancel );
f.Closing += _GUICancelEventHandler;

f.Show();

销毁表单的代码

f.Close();
f.Dispose();

应用程序使用相同的代码来创建新的表单对象。

计时器的设计师代码

this.timer1 = new System.Windows.Forms.Timer(this.components);
this.timer1.Interval = 500;
this.timer1.Tick += new System.EventHandler(this.timer1_Tick);

在formLoad事件

timer1.Start();

希望这有帮助。

1 个答案:

答案 0 :(得分:2)

如果您要杀死表单,最好让计时器独立于表单实例。

我建议,

不要在表单中使用计时器,而是将计时器保存在单独的类中,以便不会使用您要杀死的表单进行处理。

使用该类的对象访问计时器(启动,停止,重置,处理事件)。