C# Winforms:循环中的多个对话形式

C# Winforms:循环中的多个对话形式,c#,winforms,modal-dialog,multithreading,C#,Winforms,Modal Dialog,Multithreading,我有一个要求,在我的应用程序中应该显示警告框(对话形式)。问题在于,最新的警报应该首先显示,然后在关闭时显示下一个警报,以此类推。因此,我决定将对话创建移动到单独的线程,这样就不需要关闭它们来执行剩余的代码 我做了下面的事情。但问题是它们不会以对话的形式出现(可以转到主要形式而不关闭它们)。所以我决定使用ShowDialog(IWin32Window) 但它给了我跨线程操作无效的错误 如何处理这个案件 private void button2_Click(object sender, Event

我有一个要求,在我的应用程序中应该显示警告框(对话形式)。问题在于,最新的警报应该首先显示,然后在关闭时显示下一个警报,以此类推。因此,我决定将对话创建移动到单独的线程,这样就不需要关闭它们来执行剩余的代码

我做了下面的事情。但问题是它们不会以对话的形式出现(可以转到主要形式而不关闭它们)。所以我决定使用
ShowDialog(IWin32Window)
但它给了我跨线程操作无效的错误

如何处理这个案件

private void button2_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < 3; i++)
            {
                new Thread(new ThreadStart(ShowDialogue)).Start();
                Thread.Sleep(1500);
            }
        }


 private void ShowDialogue()
        {          
                FormDialogue fd = new FormDialogue(-1);
                fd.ShowDialog( ); 

        }
private void按钮2\u单击(对象发送者,事件参数e)
{
对于(int i=0;i<3;i++)
{
新线程(新线程开始(ShowDialogue)).Start();
睡眠(1500);
}
}
私人对话
{          
FormDialogue fd=新FormDialogue(-1);
ShowDialog();
}

如果希望主窗体可用,请使用
fd.Show()
而不是
fd.ShowDialog()
。不需要线程。

从您的问题中可以看出,您希望生成的“对话框堆栈”是模态的(一次查看一个对话框,必须全部关闭才能返回主窗体)

我建议不要使用线程,而是直接在ShowDialog中运行循环。例如:

private void button2_Click(object sender, EventArgs e)
{
    for (int i = 0; i < 3; i++)
    {
        FormDialogue fd = new FormDialogue(-1);
        fd.ShowDialog();
    }
}
private void按钮2\u单击(对象发送者,事件参数e)
{
对于(int i=0;i<3;i++)
{
FormDialogue fd=新FormDialogue(-1);
fd.ShowDialog();
}
}
您需要保留一个警报列表,以便根据上述优先级对其进行处理

一、 但是,您可能会发现,如果有很多警报对话,您的用户可能会不太喜欢这种方法,并且您可能会返回到一个一次显示所有警报的单一对话

另一种选择是将所有警报信息(可能在列表中)发送到单个对话框,并在该对话框中使用OK按钮在列表中循环显示警报,直到完成

任何一种方法都应该非常简单。

问题是它们看起来都不像dialogues@HenkHolterman对于要执行的剩余代码,不需要关闭它们。对话框将显示要执行的剩余代码