异步方法中的MessageBox显示错误的z-Order

时间:2018-09-12 11:01:59

标签: c# asynchronous async-await

当我从异步方法中显示消息框时,新消息框的z顺序可能是错误的, 并且用户可能会错过该框。

考虑以下代码:

C

运行此应用程序,单击ShowMessage-Button并激活一些其他窗口。 显示该消息时,它可以出现在背景中。 由于它正确地阻止了与主窗口的交互,因此对于用户来说,该应用程序似乎已挂起。

我知道,可以通过向private async void btnShowMessage_Click(object sender, EventArgs e) { await Task.Delay(3000); MessageBox.Show("Test"); } 方法显式提供所有者来防止这种情况。 无论如何,我想知道是否存在针对该问题的更通用的解决方案 (实际上,我期望Show()处理此问题。)

1 个答案:

答案 0 :(得分:1)

根据MessageBox.Show的源代码。 https://referencesource.microsoft.com/#PresentationFramework/src/Framework/System/Windows/MessageBox.cs,451867ccabfb0df5

未分配所有者时,它将使用不安全的方法获得活动窗口(因此,在等待3000毫秒后,活动窗口可能是您的应用程序,其他应用程序甚至台式机)。 因此最好分配所有者。

如果未以同步方式调用异步方法,则异步方法中的代码将不会在UI线程上运行。现在允许访问UI元素(DependencyObject,在您的情况下不是),您也应该使用Dispatcher。

您可以在这里找到答案:

Force MessageBox to be on top of application window in .net/WPF