(この回答はWPF用です。)
ええと、たとえば、ワーカー スレッドからメッセージ ボックスを開くことはできますが、その親を UI スレッドに属するものに設定することはできません (ワーカー スレッドは新しい子を追加して親ウィンドウを変更し、親ウィンドウはワーカー スレッドに属さず、通常は UI スレッドに属します)、基本的に親を null のままにしておく必要があります。
これにより、ユーザーがメッセージ ボックスを閉じずにアプリケーション ウィンドウを再度アクティブにすると、アプリケーション ウィンドウの背後に多数のメッセージ ボックスが表示されます。
適切な親ウィンドウを使用して 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;
}
}