【发布时间】:2010-07-08 16:05:53
【问题描述】:
好的,我正在寻找一些非常简单的东西:创建一个不会停止我的代码的 MessageBox。
我猜我将不得不创建一个不同的线程或什么?请就完成此任务的最佳方法提出建议。
谢谢!
【问题讨论】:
标签: c# messagebox
好的,我正在寻找一些非常简单的东西:创建一个不会停止我的代码的 MessageBox。
我猜我将不得不创建一个不同的线程或什么?请就完成此任务的最佳方法提出建议。
谢谢!
【问题讨论】:
标签: c# messagebox
您可以通过在单独的线程上调用另一个消息泵来启动它。 MessageBox.Show 泵送消息,因此无需致电 Application.Run 即可安全。
public void ShowMessageBox()
{
var thread = new Thread(
() =>
{
MessageBox.Show(...);
});
thread.Start();
}
编辑:
我可能应该提到我不建议这样做。它可能会导致其他问题。例如,如果您有两个线程泵送消息,那么如果表单正在等待某人关闭消息框,则消息框可能会卡在另一个表单后面而无法让它消失。你真的应该想办法解决这个问题。
【讨论】:
ThreadPool.QueueUserWorkItem(delegate {MessageBox.Show("Text");}); :)
ThreadPool 线程之外,这也可以解决问题。一般来说,这不是一个好习惯。
MessageBox 关闭,线程将优雅地结束。
不,您将不得不制作自己的消息框表单。 MessageBox 类仅支持类似于.ShowDialog() 的行为,这是一种模态操作。
只需创建一个带有参数的新表单,并使用这些参数来构建您喜欢的样式消息框。
2014 年 7 月 31 日更新
本着为通过 google 发现此内容的其他人保持清晰的精神,我想花一点时间来解释一下:
在底层MessageBox 是一个围绕Windows SDK user32.dll MessageBox Function 的精美 C# 包装器,因此其行为方式完全相同(在将 .NET 枚举转换为在系统调用中表示相同事物的整数之后。
这意味着当您调用MessageBox.Show() 时,该调用将被编组到操作系统,并将阻塞当前线程,直到选择了一个选项或窗口被杀死。为了防止您的代码被暂停,您需要在单独的线程上启动消息框,但这意味着从消息框返回的任何结果(Yes / No / Ok / Cancel / Etc...) 将返回到负责调用消息框的单独线程。
如果您对以这种方式启动的消息框的结果采取行动,您必须将结果分派回 UI 线程以确保线程安全。
或者,您可以在 WinForms / WPF 中创建自己的消息框表单并使用 .Show() 方法调用它。按钮上的任何点击事件都将在 UI 线程上执行,您不必将调用分派回 UI 线程来操作 UI 中的内容。
【讨论】:
Messagebox.Show(MessageBoxButtons.OK),程序会暂停直到用户单击“确定”按钮吗?因为我想运行我的自动化流程,一旦前两个流程完成,通过 Messagebox 暂停流程,然后在用户单击消息框后,运行下一个自动化流程。
MessageBox.Show() 方法与.ShowDialog() 的运行方式相同。这是一个阻塞操作,因此执行会暂停,直到对话框关闭。我已经更新了我的答案以更清楚。