2012-05-10 47 views
0

好吧..我的主表单由一些用户控件和一些可以打开其他表单的按钮组成。我有一个后台工作人员,用户界面不会冻结。后台工作人员更新表单上的时钟,并且正在检查数据库是否符合某个条件。如果符合条件,则隐藏此表单并显示新表单。Form.Show()和Form.Visible ThreadSafe

我也在做一个检查,看看第二个表格是否已经打开。因为一旦我打开它,我就不关闭它。我只是使用隐藏和显示。所以我的问题是,我找不到线程安全的方式来创建和打开表单,或者如果表单已经打开,则显示该表单。我也必须隐藏当前表单。

这里是我的代码有

//bool variable to determine if i need to open the form 
if (inShift) 
      { 
       frmInShift InShift = null; 
       if ((InShift = (frmInShift)IsFormAlreadyOpen(typeof(frmInShift))) == null) 
       { 
        InShift = new frmInShift(); 
        InShift.RefToParent = this; 
       } 
       else 
       { 
        InShift.RefToParent = this; 
       } 
       InShift.ResetButtons(); 
       InShift.Show(); 
       this.Visible = false; 
      } 

我知道这个代码的工作,我使用它在窗体上的一个按钮。我只需要使这个线程安全。部分问题实际上是在表单尚未打开时创建的。

我应该在主线程上检查吗?如果可行,我将如何调用Show()方法?

编辑: 我在我的主窗体加载事件上创建我的第二个窗体。所以我需要做的就是设置一些公共变量并显示表单并隐藏主窗体。

我RunWorkerCompleted代码看起来是这样的:当我打电话调用这个隐藏form..help

  if (inShift) 
      {     
       InShift.RefToParent = this; 
       InShift.ResetButtons(); 
       InShift.Show(); 
       //program freezes up here 
       this.Invoke(new ThisFormVisibleCB(ThisFormVisible), new object[] { false }); 
      } 

程序冻结?

回答

1

解决..愚蠢的问题我应该很久以前才知道。

对于初学者...我摆脱了背景工作,并把所有东西都放在计时器中,但仍然无法工作。然后我意识到我还在使用“线程”计时器。

我转我的计时器从

System.Timers.Timer 

System.Windows.Forms.Timer 

,现在完美的作品。