代码之家  ›  专栏  ›  技术社区  ›  Bryce Wagner

在应用程序后显示对话框。退出()

  •  1
  • Bryce Wagner  · 技术社区  · 14 年前

    在某些情况下,如果应用程序没有正确关闭,我希望向用户显示一条错误消息,但是messagebox.show()在调用application.exit()之后实际上没有做任何事情。有没有办法说服它在application.exit()之后显示一个对话框?

    5 回复  |  直到 8 年前
        1
  •  2
  •   amit kumar    14 年前

    您必须使用启动应用程序的父进程。当应用程序返回时,返回值对父进程可用。如果应用程序的返回值为非零(不成功),则显示父进程的消息框。

        2
  •  0
  •   Gern Blanston    14 年前

    我假设这是一个窗口应用程序,所以 程序CS 你可以把下面的代码…这假定您创建一个公共属性或字段“exitok”,并在主窗体中根据需要进行设置。

    MainForm mf = new MainForm();
    Application.Run(mf);
    if (mf.ExitOk)
    {MessageBox.Show("Exiting OK");}
    else
    {MessageBox.Show("Exiting Not OK");}
    

    需要注意的一点是,您可能需要将mf设置为空或在末尾设置类似的值。

    还有谁想对可能需要的任何其他“清理”发表评论?

        3
  •  0
  •   shf301    14 年前

    在application.exit()之后不会调用任何内容。application.exit()不返回(除非取消退出),否则它将退出应用程序。调用application.exit()后,进程将不再运行,因此无法在进程退出后运行代码。

    是否对application.exit()进行编码?如果是这样,请更改对application.exit()的调用以调用myapplication.exit(),其中myapplication是:

    public static class MyApplicaiton {
         public static void Exit() {
              MessageBox.Show("Exiting Message");
              Application.Exit();
          }
    }
    
        4
  •  0
  •   Daniel Rose    14 年前

    退出前,应用程序将激发 ApplicationExit 事件(WinForms)或 Exit 事件(WPF)。例如,作为事件处理程序代码的一部分,您可以显示消息框。例如,在我的应用程序中,我显示了一个“是否要保存未保存的更改?”对话框(如果适用)。

    请注意,不可能取消事件处理程序中的退出。

        5
  •  0
  •   Jason Lim    8 年前

    到目前为止,我还没有找到关于这个问题的很多信息。然而,我确实发现了一个看似相关的讨论 here . 经过一番研究,我设法找到了一个解决方案,但它只允许您在初始后在主函数中使用消息框。 Application.Run 呼叫已返回。

    注意:以下所有调查都是在.NET Framework 4.5下完成的。

    在论坛讨论中,它看起来像调用应用程序。调用后退出窗口线程 Application.Run(Form) 使应用程序系统进入关闭状态。在这种状态下,没有新的呼叫 application.run(表单) 将起作用,不能显示任何消息框。另一方面,如果你打电话 Application.Exit 调用后从窗口线程 Application.Run(new ApplicationContext()) 或者只是 Application.Run() ,这种情况不会发生。可以打电话来 应用程序运行 同样,消息框工作正常。

    经过一番试验,我发现如果你打电话 应用程序.run() (无形式)进入停机状态后,会发生两件事。第一个是 应用程序.run() 呼叫立即退出。第二个问题是关闭状态被清除,常规行为被恢复。这很好,但它会带来一个问题:如果你没有打电话 应用程序。退出 从你的形式,无形式 应用程序.run() 调用将在等待发生时无限期阻塞。

    要解决此问题,可以使用 Application.Idle 将自己从阻塞状态中解救出来的事件。起初我试过:

    Application.Run(new Form1()); // Calls Application.Exit()
    
    Application.Idle += (o, e) => Application.Exit();
    Application.Run();
    
    MessageBox.Show("Close, but no banana...");
    

    但不管出于什么原因,在这种情况下, Application.Exit() 调用的行为类似于 应用程序。退出() 在里面 application.run(表单) 呼叫。我们遇到了同样的情况,消息框不显示,随后 应用程序运行 电话不起作用。

    再做一点实验,我发现以下方法确实有效:

    Application.Run(new Form1()); // Calls Application.Exit()
    
    Application.Idle += (o, e) => Task.Run(() => Application.Exit());
    Application.Run();
    
    MessageBox.Show("I'm alive!");
    

    这有点难看,对于不知情的人来说,这看起来完全是胡说八道,但似乎能完成这项工作。消息框按预期工作,可以调用 应用程序运行 再次发挥作用。

    我要注意的最后一件事是 应用程序。退出 呼叫已排队。也就是说,你必须打电话 应用程序.run() 每次一次 应用程序。退出 在窗体线程内部调用以清除关闭状态。所以如果你的程序可以调用 应用程序。退出 多次,则上述解决方案将不起作用。

    我没有测试以下内容,但是如果您处理的是多个 应用程序。退出 电话:

    Application.Run(new Form1()); // Calls Application.Exit() multiple times
    
    bool done = false;
    while(!done)
    {
        // Application.Idle is cleared after each run
        Application.Idle += (o, e) =>
        {
            done = true;
            Task.Run(() => Application.Exit());
        };
        Application.Run();
    }
    
    MessageBox.Show("I'm alive!");
    

    在这一点上,最好用某种帮助函数来包装它,但我将把它留给开发人员自己选择。

    无论如何,我希望这能帮助其他遇到这个问题的人。这个 应用程序运行 行为似乎非常不规则,所以我假设这是一个bug。但如果有人想调查这件事,你就不客气了。