Form.Show()和Form.Visible ThreadSafe

时间:2012-05-10 14:03:36

标签: c# winforms thread-safety

好的..我的主窗体包含一些用户控件和一些可以打开其他窗体的按钮。我有一个后台工作人员,UI不会冻结。后台工作程序更新表单上的时钟,并且还检查数据库是否满足某个条件。如果满足条件,则隐藏此表单并显示新表单。

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

这是我的代码

//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代码如下所示:

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

当我调用Invoke来隐藏表单时,程序冻结了.help ??

1 个答案:

答案 0 :(得分:1)

解决了......很久以前我应该抓住的愚蠢问题。

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

我从

切换了我的计时器
System.Timers.Timer 

System.Windows.Forms.Timer 

现在它完美无缺。