(此答案适用于 WPF。)
好吧,你可以从一个工作线程打开一个消息框,但是你不能将它的父级设置为属于 UI 线程的东西(因为工作线程会通过添加一个新的子窗口来更改父窗口,并且父窗口不属于工作线程,它通常属于UI线程),所以你基本上是被迫离开父空。
如果用户不关闭它们而是重新激活应用程序窗口,这将导致一堆消息框位于您的应用程序窗口后面。
您应该做的是使用适当的父窗口在 UI 线程上创建消息框。为此,您将需要 UI 线程的调度程序。调度程序将在 UI 线程上打开您的消息框,您可以设置其正确的父级。
在这种情况下,我通常在启动线程时将 UI 调度程序传递给工作线程,然后使用一个小助手类,这对于处理工作线程上的异常特别有用:
/// <summary>
/// a messagebox that can be opened from any thread and can still be a child of the
/// main window or the dialog (or whatever)
/// </summary>
public class ThreadIndependentMB
{
private readonly Dispatcher uiDisp;
private readonly Window ownerWindow;
public ThreadIndependentMB(Dispatcher UIDispatcher, Window owner)
{
uiDisp = UIDispatcher;
ownerWindow = owner;
}
public MessageBoxResult Show(string msg, string caption="",
MessageBoxButton buttons=MessageBoxButton.OK,
MessageBoxImage image=MessageBoxImage.Information)
{
MessageBoxResult resmb = new MessageBoxResult();
if (ownerWindow != null)
uiDisp.Invoke(new Action(() =>
{
resmb = MessageBox.Show(ownerWindow, msg, caption, buttons, image);
}));
else
uiDisp.Invoke(new Action(() =>
{
resmb = MessageBox.Show( msg, caption, buttons, image);
}));
return resmb;
}
}