【问题标题】:finally block not executing after Application.Run(new main_form)finally 块在 Application.Run(new main_form) 之后不执行
【发布时间】:2011-10-13 22:00:51
【问题描述】:

我想在我的程序退出之前执行一些代码,所以我认为编辑到 VS 创建的 Program.cs 看起来像:

...
try
{
    Application.Run(new main_form);
}
finally
{
    special_shutdown_code();
}
...

可以解决问题,但是当我单击主窗体右上角的 [x] 时,我的 special_shutdown_code() 没有被执行。我回去添加了打印语句:

...
try
{
    System.Console.WriteLine("Before");
    Application.Run(new main_form);
    System.Console.WriteLine("After");
}
finally
{
    System.Console.WriteLine("finally");
    special_shutdown_code();
}
System.Console.WriteLine("post-finally");
...

“之前”是唯一打印的输出。

根据我的阅读,Application.Run 函数应该返回。我迷路了。任何解释将不胜感激。

这是一个C++/CLR + C# + C 混合程序,但主要部分是C#。

我希望得到关于未发生的事情的解释,而不是关于如何完成相同功能的建议。在大多数情况下,我能够解决这个问题,但是看起来最干净、最容易理解并且正确的方法根本不起作用让我感到困惑。

【问题讨论】:

  • 你是如何关闭它的?如果您尝试,有一些非常残酷的方法可以杀死应用程序...
  • 所以我认为“After”也没有打印出来?以及如何关闭这个程序?
  • 我用标题栏右上角的 X 关闭了窗口。我知道异常并不是大多数编程书籍希望我们相信的神奇工具,但我预计这对于大多数情况来说已经足够了。
  • How can I execute code after my form starts? 的可能重复项 确实很好地描述了答案中的原因。
  • @ChrisLively:这不是那个问题的重复。这个问题似乎是关于在表单启动或打开时执行一些代码。我的问题是关于表格关闭后;特别是对于例外。将finally 块放入Load 事件处理程序没有意义,并且由于应用程序可能无法使用主表单的Closing 处理程序实际打开表单,因此无法处理许多死亡路径我认为可以处理。

标签: c# winforms visual-studio-2008 interop try-finally


【解决方案1】:

你可以试试:

Form mainForm = new MainForm();
mainForm.Closing += delegate(...)
{

};
Application.Run(mainForm);

不确定这是否真的有效......

【讨论】:

  • 发生未处理的异常时会运行吗?我认为不会。
  • @Jason:我很欣赏这个建议,但我实际上是在为程序的行为方式寻找解释。
【解决方案2】:

我在查看在没有主窗体的线程上运行消息泵时发现了答案。

Application.Run() 有 3 个版本。我发现关于使用不带参数的版本的好信息很少。我看到最多的是Application.Run(Form),我相信它最终可能会在进行一些设置后调用Application.Run(new ApplicationContext(Form))。这将设置 `ApplicationContext.MainForm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2010-09-11
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    相关资源
    最近更新 更多