好的,我正在寻找一些相当简单的东西:创建一个不会阻止我的代码的MessageBox。
我猜我需要创建一个不同的线程或者其他什么东西来完成这个任务?请告诉我最好的实现方式。
谢谢!
好的,我正在寻找一些相当简单的东西:创建一个不会阻止我的代码的MessageBox。
我猜我需要创建一个不同的线程或者其他什么东西来完成这个任务?请告诉我最好的实现方式。
谢谢!
你可以通过在单独的线程上调用它来启动另一个消息泵。 MessageBox.Show
会将消息泵出,因此无需调用 Application.Run
即可安全执行。
public void ShowMessageBox()
{
var thread = new Thread(
() =>
{
MessageBox.Show(...);
});
thread.Start();
}
编辑:
我应该提到,我不建议这样做。这可能会引起其他问题。例如,如果您有两个线程在推送消息,那么消息框可能会被卡在另一个窗体后面,如果该窗体正在等待某人关闭消息框,则没有办法让它消失。你真的应该尝试找到另一种解决问题的方法。
不,你需要自己创建消息框表单。 MessageBox
类仅支持类似于 .ShowDialog()
的模态操作。
只需创建一个新的表单,使用参数来构建出符合您喜好的样式的消息框。
更新 2014-07-31
为了保持对通过 Google 发现此问题的其他人的清晰度,我想花点时间更详细地解释一下:
在幕后,MessageBox
是一个精巧的 C# 包装器,它围绕着 Windows SDK user32.dll MessageBox Function 进行操作,因此行为完全相同(在将 .NET Enums 转换为表示系统调用中相同的整数之后)。
这意味着当您调用 MessageBox.Show()
时,调用会被编组到操作系统并且将阻塞当前线程,直到选择选项或关闭窗口。为了防止代码停止,您需要在单独的线程上启动消息框,但这将意味着从消息框返回的任何结果(是 / 否 / 确定 / 取消 / 等等...)将返回到被指定调用消息框的单独线程。
如果您对以这种方式启动的消息框的结果采取行动,则必须将结果分派回 UI 线程以进行线程安全。
或者,您可以在 WinForms / WPF 中创建自己的消息框表单,并使用 .Show()
方法调用它。按钮上的任何单击事件都将在 UI 线程上执行,您无需将调用分派回 UI 线程以操作 UI 中的内容。
Messagebox.Show(MessageBoxButtons.OK)
,程序会在用户点击OK按钮之前暂停吗?因为我想要运行我的自动化流程,在前两个流程完成后,通过Messagebox暂停流程,然后在用户点击消息框后继续运行下一个自动化流程。 - HanH1113MessageBox.Show()
方法在底层实际上以与 .ShowDialog()
相同的方式运行。它是一个阻塞操作,因此执行会一直停止,直到对话框关闭。我已经更新了我的答案,使其更加清晰明了。 - Aren
ThreadPool
线程并不是一个好的做法。 - Brian GideonMessageBox
关闭,线程将会优雅地结束。 - Brian Gideon