2011-06-16 67 views
1

我有这个奇怪和不一致的问题。窗体控件在窗体创建后不久自动处理

该应用程序内置于运行在Windows Mobile 6.5设备上的紧凑型框架3.5中。

应用程序的屏幕流程有点像这样。

MainScreen(其总是处于运行状态) 屏蔽1 画面2 屏幕3

MainsScreen - >屏蔽1 - >画面2 - >屏幕3 - > MainScreen

当循环完成,并于MainScreen应用焊盘背面,MainScreen.Activated()被调用,并且一个条件自动启动Screen1。 代码看起来是这样的:

 private void MainScreen_Activated(object sender, EventArgs e) 
    { 
     if (Condition) 
     { 
      NextScreen(); 

      return; 
     } 

      //other code here 

    } 
    private void NextScreen() 
    { 

     Screen1 formScreen1 = new Screen1(); 
     formScreen1 .Show(); 
    } 

屏蔽1也有这段代码形式的负载:

private void Screen1_Load(object sender, System.EventArgs e) 
{ 
     if(Condition) 
     { 
      NextScreen(); 
     } 
} 
private void NextScreen() 
    { 

     Screen2 formScreen2= new Screen2(); 
     formScreen2.Show(); 

     Close(); 
    } 

所以当Screen1_Load满足这个条件的应用程序会自动启动屏幕2和关闭这个。

在这种特殊情况下,有时屏幕2上的控件有时会在创建表单后被处理。我知道这一点,因为我实际上可以在屏幕上看到一秒钟的控制。

这个问题也不一致,它不会一直发生在确切的情况下,这使得我相信它有时间不对。 得到处置的控制似乎也随机选择,大部分时间它是相同的按钮,但有些情况下,表单中的列表框被丢弃。

请注意,应用程序中没有代码可以调用控件。

任何帮助,非常感谢。谢谢,希望我解释得很好。

回答

0

我找到了问题的原因和解决方案。 多的调查后,我发现,设置在按键与此机会异常调试发生重合:

A first chance exception of type 'System.ObjectDisposedException' occurred in System.Drawing.dll 
A first chance exception of type 'System.ObjectDisposedException' occurred in System.Drawing.dll 

我还发现,这个机会异常可以当设备或认为它的运行内存发生导致GC运行并尝试清除内存。

我使用了这个问题的答案 Prevent Garbage Collector并且还在遇到此问题的表单上添加了GC.KeepAlive。

机会异常仍然在调试中同时发生,但自那时以来我一直无法重现该问题。