C# 单例对话模式

C# 单例对话模式,c#,winforms,dialog,singleton,C#,Winforms,Dialog,Singleton,我有一个应用程序,它有一个用户输入对话框。我希望此对话框在任何给定时间只允许打开一次。通常我会通过一个模态对话框来实现这一点,但我需要用户能够在对话框打开时与父窗体交互。我试图通过以下代码实现这一点: private static Boolean dialogShown = false; public Dialog() { if (!dialogShown ) { dialogShown =

我有一个应用程序,它有一个用户输入对话框。我希望此对话框在任何给定时间只允许打开一次。通常我会通过一个模态对话框来实现这一点,但我需要用户能够在对话框打开时与父窗体交互。我试图通过以下代码实现这一点:

    private static Boolean dialogShown = false;
    public Dialog()
    {
            if (!dialogShown )
            {
                dialogShown = true;
                InitializeComponent();
            }
            else
            {
                this.Close();
            }
    }

    private void Dialog_Closed(object sender, EventArgs e)
    {
            dialogShown = false;
    }
这样做的问题是,构建此表单的代码可能是IE

    public void ShowDialog()
    {
        Dialog dialog = new Dialog();
        dialog.Show();
    }
尝试显示已关闭的窗体时引发异常。它并非总是发生,但很容易重复。所以问题是,做这件事的正确方法是什么,因为我的互斥锁在这里不可靠

我在这里看到了一些其他类似的问题,但在大多数情况下,用例有比对话框更好的解决方案。在这种情况下,它必须是一个非模态的单例对话框

-编辑,我不应该使用单例,因为它会引起一些混乱。我想有一个微妙的区别,我只担心在任何给定的时间都有一个对话框打开,而不关心每次都是同一个实例。我也不应该使用变量名Visible,因为这也有误导性。我编辑了代码以避免这种情况。为这篇误导性的文章道歉…

Close()
将处理您的对话框,阻止您重用它。
改为调用
Hide()

其他一些注意事项:

  • 您不需要事件处理程序
  • WinForms是严格的单线程;你不需要任何锁
  • 构造函数中的任何逻辑都没有意义

为什么必须是单例对话框?您试图解决的实际问题是什么?用户输入的查找值。只有一次打开一个对话框才合适。由于存在多个对话框,这不会导致任何运行时问题,但是用户很容易意外地打开表单的多个实例,我想防止这种情况。另外,为什么要使用锁定?无论如何,对话框只能显示在UI线程上。锁定不会为您带来任何好处。如果您重用该对话框,您将保留用户的最后输入。你想要吗?我不知道对话框只显示在UI线程上。我担心如果用户的速度足够快,可能会有关于互斥的争用。这很好地解决了问题,并使表单成为一个真正的单例。你是100%正确的,我不需要事件处理程序或锁,我的构造函数现在是空的。谢谢@SLaks