C# 创建一个不包含';停止代码?

C# 创建一个不包含';停止代码?,c#,messagebox,C#,Messagebox,好的,我正在寻找一些非常简单的东西:创建一个不停止代码的MessageBox 我猜我必须创建一个不同的线程或其他什么?请就实现这一目标的最佳方式提出建议 谢谢 不,您必须制作自己的消息框表单。MessageBox类只支持类似于.ShowDialog()的行为,这是一种模式操作 只需创建一个接受参数的新表单,并使用这些参数根据您的喜好构建一个样式化的消息框 更新2014-07-31 本着为其他通过谷歌发现这一点的人保持清晰的精神,我想花点时间进一步解释一下: 在引擎盖下,MessageBox是一

好的,我正在寻找一些非常简单的东西:创建一个不停止代码的MessageBox

我猜我必须创建一个不同的线程或其他什么?请就实现这一目标的最佳方式提出建议


谢谢

不,您必须制作自己的消息框表单。
MessageBox
类只支持类似于
.ShowDialog()
的行为,这是一种模式操作

只需创建一个接受参数的新表单,并使用这些参数根据您的喜好构建一个样式化的消息框


更新2014-07-31

本着为其他通过谷歌发现这一点的人保持清晰的精神,我想花点时间进一步解释一下:

在引擎盖下,
MessageBox
是一个奇特的C#包装器,围绕着,因此其行为方式完全相同(将.NET枚举转换为表示系统调用中相同内容的整数后)

这意味着当您调用
MessageBox.Show()时
调用被封送至操作系统,并将阻止当前线程,直到选择选项或关闭窗口。为防止代码暂停,您需要在单独的线程上启动消息框,但这意味着从消息框返回的任何结果(//确定/取消/等…)将返回到负责调用消息框的单独线程

如果对以这种方式启动的消息框的结果进行操作,则必须将结果发送回UI线程以确保线程安全


或者,您可以在WinForms/WPF中创建自己的消息框表单,并使用
.Show()调用它
方法。按钮上的任何单击事件都将在UI线程上执行,您不必将调用发送回UI线程来操作UI中的内容。

您可以通过在单独的线程上调用来启动另一个消息泵。
MessageBox.显示
泵消息,这样无需调用
应用程序即可安全操作操作。运行

public void ShowMessageBox()
{
  var thread = new Thread(
    () =>
    {
      MessageBox.Show(...);
    });
  thread.Start();
}
编辑:


我可能应该提到,我不建议这样做。这可能会导致其他问题。例如,如果您有两个线程泵送消息,那么如果表单正在等待有人关闭消息框,则消息框可能会卡在另一个表单后面,无法使其离开。您真的应该尝试弄清楚另一种解决问题的方法。

好的,我明白了,所以我只需要创建自己的表单。非常可行,谢谢!如果我有
Messagebox.Show(MessageBoxButtons.Ok)
在用户单击“确定”按钮之前,程序是否会暂停?因为我想运行我的自动化过程,并且在前两个过程完成后,通过Messagebox暂停该过程,然后在用户单击Messagebox后,运行下一个自动化过程。@HanH1113
Messagebox.Show()
方法的运行方式与
.ShowDialog()
的运行方式相同。这是一个阻塞操作,因此执行会暂停,直到对话框关闭。我已更新了我的答案,使其更加清晰。
ThreadPool.QueueUserWorkItem(委托{MessageBox.Show(“Text”);
:)@马库斯:这也行,但它会挂起
线程池
线程,这通常不是一个好的做法。在Brian的代码示例中,如何停止线程(并关闭它?)当messagebox关闭时。多线程对我来说是非常神秘和新鲜的,因此拥有另一个线程的内部工作我无法理解。@Soo:你不必做任何特殊的事情。一旦关闭
messagebox
,线程将优雅地结束。感谢你的解决方案,这似乎很明显,但我完全忘记了做什么诸如此类的事;)