【问题标题】:Doesn't wait for result of messageBox不等待 messageBox 的结果
【发布时间】:2012-08-21 17:37:08
【问题描述】:

当在当前处于用户测试中的客户端应用程序中捕获未处理的异常时,我编写了这样的代码。

catch(Exception ex)
{
    var result = MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK);
    Current.Shutdown();
}

但是消息框只是很快出现然后程序关闭。为什么代码不等待结果出现。我该怎么做?

【问题讨论】:

  • 这不应该发生。使用调试器找出其他情况。
  • 在消息框参数的开头使用null,这将使消息框成为一个独立的顶级界面。
  • 这是在启动时发生的,我想这可能是问题所在。它在 mainWindow 被解析之前完成。
  • 我们需要做的远不止这些。您发布的代码(除了Current.Shutdown(),我不知道Current 是什么)工作正常(在创建任何窗口之前会显示消息框,并且在按下确定之前不会退出)。

标签: c# .net wpf messagebox


【解决方案1】:

我遇到了类似的问题。问题是在显示主窗口之前抛出异常,因此没有窗口可以显示消息框。 Swamy 的回答只是强制延迟时间,以便可以初始化窗口。 IMO 不太优雅。找到了更好的解决方案 [这里]WPF MessageBox not waiting for result [WPF NotifyIcon].

只需在MessageBox.Show(....) method 中指定MessageBoxOptions.DefaultDesktopOnly

【讨论】:

    【解决方案2】:

    从文档到MessageBox类:

    消息框总是有一个所有者窗口。默认情况下,消息框的所有者是打开消息框时应用程序中当前处于活动状态的窗口。但是,您可以使用多个Show 重载之一为Window 指定另一个所有者。有关所有者窗口的更多信息,请参阅Window.Owner

    因此,您的问题与this question 非常相似,其中应用程序在用户关闭消息框之前存在。

    首先要尝试将null 作为Window 参数传递。

    MessageBox.Show(null, ex.Message, "Error", MessageBoxButton.OK);
    

    如果您有 Window 类的实例,例如您的主窗口对象,请传递它而不是 null

    MessageBox.Show(mainWindow, ex.Message, "Error", MessageBoxButton.OK);
    

    如果您当前处于任何主窗口方法中,则可以将this 作为窗口传递:

    MessageBox.Show(this, ex.Message, "Error", MessageBoxButton.OK);
    

    仅在此时没有可用的主窗口对象的情况下使用null

    看看MessageBox sample。您应该能够看到this 作为所有者窗口传递的情况与null 传递的情况之间的区别。

    【讨论】:

    • OK null 只抛出一个空引用异常,但我想知道我拥有的窗口当前是否没有调用 Show() 方法,它作为一个适当的所有者仍然很好吗?
    • 是的,所有者窗口可能在屏幕上不可见。
    • 当使用null 时,你想调用哪个函数可能不明确。为了明确起见,您可以将null 转换为Window 或创建一个局部变量Window owner = null 并使用owner 变量作为Show 的参数。
    【解决方案3】:

    您是在脚本还是实际的 .net 应用程序中使用此代码? 您在消息框按钮中缺少“s”。 你应该这样写代码:

    try
    {
        throw new Exception("My new exception");
    }
    catch (Exception ex)
    {
        DialogResult result = MessageBox.Show(ex.Message, "Error",MessageBoxButtons.OK);
    } 
    

    如果这不起作用,您应该查看引发异常的代码以进行进一步调试...

    【讨论】:

    • 我猜你的代码来自 Windows 窗体,因为 MessageBoxButton 是正确的,结果是 MessageBoxResult。试过了,但没有改变任何东西。我认为这与我在创建主窗口之前实例化此消息框有关。
    • 很高兴有两个不同的 MessageBox 类做大致相同的事情:System.Windows.Forms.MessageBoxSystem.Windows.MessageBox。我认为这很令人困惑,尤其是在提问时。虽然问题被标记为wpf,这意味着使用了System.Windows.MessageBox
    【解决方案4】:

    这是一个非常古老的问题,但可能下面的答案可能会引起其他人的注意,

    我有同样的情况,我想在创建主窗口之前显示消息框,在我的情况下,消息框在我点击确定之前消失了,应用程序将关闭。

    我正在使用 async 和 awaits 并添加低至 10 毫秒的延迟为我解决了这个问题。(因为此时已加载主窗口)

    await Task.Delay(10);
    if (MessageBox.Show(MainWindow, "Message", "Error", MessageBoxButton.OK) == MessageBoxResult.OK)
    {
        Current.Shutdown();
    }
    

    可能对于非异步方法 Thread.Sleep 也可以工作(未尝试)。

    【讨论】:

      【解决方案5】:

      在非异步方法中显示任何窗口之前,这为我解决了问题:

       if (Task.Run(() => MessageBox.Show("test", "Fehler", MessageBoxButton.OK, MessageBoxImage.Error)).Result == MessageBoxResult.OK)
       {
           Environment.Exit(1);
       }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-22
        相关资源
        最近更新 更多