首页 > 解决方案 > C#,MessageBox.Show 背后的机制

问题描述

在 Visual Studio C# 中,MessageBox.Show将暂停但不锁定当前线程,直到消息窗口关闭。

甚至可以将其放入if statement并等待结果。

为了了解其背后的机制,我尝试自己制作一个。

假设有 2 种形式,MainForm并且MsgForm. 从单击按钮时MsgForm调用。MainForm你可以想象这MsgForm是我的版本MessageBox.Show

关键是等待MainForm直到单击MsgForm按钮MsgForm

也就是说,使其成为“模态”。

我可以简单地通过调用来管理它MsgForm.ShowDialog()MainForm因为ShowDialog()它本身是模态的。

但后来我想,如果我没有那个内置机制怎么办!?我怎么能做到同样的事情!?

由于Show()不是模态的,所以我认为使用它进行测试很好。如果我设法用 停止程序Show(),那么我成功地重新创建了MessageBox.Show.

我第一次尝试调用AutoResetEvent.WaitOne()MsgForm它锁定了整个事情!结束时也是如此MainForm

但后来我意识到必须在“不同的线程”上调用WaitOne()andMsgForm才能不相互锁定。

所以我将以下代码放入MainForm

private void button1_Click(object sender, EventArgs e)
{
    if(Test())
    {
        label1.Text = "Done!";
    }
}

private bool Test()
{
    Thread t = new Thread(doTest);

    t.Start();
    Class1.ARE.WaitOne();    //ARE is a public static AutoResetEvent in Class1 for global usages.
    return true;
}

private void doTest()
{
    MsgForm frm = new MsgForm();

    frm.Show();
}

只需调用Class1.ARE.Set();MsgForm按钮单击事件。

现在它不仅锁定了整个东西,而且还让MsgForm“闪光”后消失了。

我真的走到了尽头!

有人可以这么好心告诉我我哪里做错了吗!?

非常感激!

标签: c#multithreadingmodal-dialogmessageboxautoresetevent

解决方案


推荐阅读