Application.Exit()后显示对话框

时间:2010-03-12 16:48:40

标签: c# .net

在某些情况下,如果应用程序未正确关闭,我希望向用户显示错误消息,但MessageBox.Show()在调用Application.Exit()后实际上没有执行任何操作。有没有办法说服它在Application.Exit()之后显示一个对话框?

5 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

我假设这是一个窗口的应用程序,所以在 Program.cs 中你可以使用下面的代码...这假设你创建一个公共道具或字段'ExitOk'并根据需要设置在主体中。

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

需要注意的一点是,您可能还需要将mf设置为NULL或类似的结尾。

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

答案 2 :(得分:0)

在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();
      }
}

答案 3 :(得分:0)

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

请注意,无法取消事件处理程序中的退出。

答案 4 :(得分:0)

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

注意:以下所有调查均已在.Net Framework 4.5下完成。

在论坛讨论中,看起来在调用Application.Run(Form)后在窗口线程中调用Application.Exit会导致Application系统进入关闭状态。在此状态下,Application.Run(Form)的新呼叫不起作用,也不会显示任何消息框。另一方面,如果您在调用Application.Exit或仅Application.Run(new ApplicationContext())后从窗口线程调用Application.Run(),则不会发生这种情况。可以再次拨打Application.Run,消息框就像正常一样工作。

经过一些实验,我发现如果你在进入关机状态后调用Application.Run()(没有形式),就会发生两件事。首先是Application.Run()呼叫立即退出。第二个是清除关闭状态并恢复常规行为。这很好,但它提出了一个问题:如果你没有从表单中调用Application.Exit,那么无形Application.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.Exit()调用中调用Application.Run(Form)时的行为类似。我们遇到的情况与消息框无法显示以及随后的Application.Run电话无法正常工作相同。

进行更多实验,我发现以下内容确实有效:

Application.Run(new Form1()); // Calls Application.Exit()

Application.Idle += (o, e) => Task.Run(() => Application.Exit());
Application.Run();

MessageBox.Show("I'm alive!");

它有点难看,对于那些不知情的人来说,它看起来纯粹是荒谬的,但它似乎完成了工作。消息框按预期工作,可以再次调用Application.Run函数之一。

我应该注意的最后一件事似乎是Application.Exit次呼叫排队。也就是说,为了清除关闭状态,每次在表单线程中调用Application.Run()时,必须调用Application.Exit一次。因此,如果您的计划可能多次拨打Application.Exit,则上述解决方案无法正常运行。

我还没有对以下内容进行过测试,但如果您正在处理多个Application.Exit来电,那么这样的话应该会有效:

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!");

此时,最好将其包含在某种辅助函数中,但我会将其留给开发人员的偏好。

无论如何,我希望这可以帮助遇到这个问题的其他人。 Application.Run行为似乎非常不规律,所以我会假设这是一个错误。但如果有人想对此进行调查,那么你非常欢迎。