Form.Show() and Form.Visible ThreadSafe

本文关键字:Form Visible ThreadSafe and Show | 更新日期: 2023-09-27 18:33:50

Ok..我的主窗体由一些用户控件和一些将打开其他窗体的按钮组成。 我有一个后台工作人员,其中 UI 不会冻结。 后台工作线程更新窗体上的时钟,并检查数据库是否满足特定条件。 如果满足条件,则隐藏此窗体并显示新窗体。

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

这是我有的代码

//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(( 方法?

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

我的 RunWorkerDone 代码如下所示:

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

当我调用 Invoke 以隐藏表单时,程序冻结。帮助??

Form.Show() and Form.Visible ThreadSafe

已解决。愚蠢的问题我早就应该抓住了。

对于初学者..我摆脱了后台工作人员,把所有东西都放在一个计时器里。它仍然不起作用。 然后我意识到我仍在使用"线程"计时器。

我把计时器从

System.Timers.Timer 

到 a

System.Windows.Forms.Timer 

它现在运行良好。