使用ApplicationContext后,在关闭主窗体后,应用程序进程不会退出

时间:2014-01-22 10:58:10

标签: c# winforms process exit applicationcontext

我有一个Windows窗体应用程序,关闭主窗体后,进程不会退出。

我使用ApplicationContext,因为我有一个生成主表单的演示者。

Application.Run(new ApplicationContext(Instance.InitPresentationManager()));

我有方法DestroyHandle和OnHandleDestroyed覆盖以进行调试。 在那里我可以看到DestroyHandle被调用但是OnHandleDestroyed没有! 这就是我的进程仍在运行的原因,因为ApplicationContext在内部注册到HandleDestroyed事件。

在DestroyHandle方法中,属性HandleCreated甚至从true更改为false。 我甚至覆盖了WndProc并且可以看到没有收到消息“2”(这个在Control类中调用WmDestroy并触发OnHandleDestroyed事件)。

这怎么可能?

说明:

  • OnHandleDestroy仅在RecreatingHandle为真时开始调用
  • 当附加到进程并断开所有线程时,主线程仍然在Application.Run方法
  • 我甚至附上了一个内存分析器,告诉我我的主表单不再有实时实例
  • Application.Exit在主窗体的处理中起作用并处理症状但不处理问题本身
  • 计算机重启后,它可以正常运行一段时间,但最终会再次出现问题
  • Win 7 64 bit,VS 2010,.net 4.0

1 个答案:

答案 0 :(得分:0)

问题是表单关闭,并不一定意味着应用程序应该终止它当前正在做的事情。 (想想写日志文件,整齐地关闭通信流等)。

一个帖子有一个属性IsBackground(见http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground(v=vs.110).aspx),它有效地表示在中期操作中是否允许它被杀死。检查任何正在进行的线程,以确保它们使用适当的后台线程标记运行。

在应用程序上下文中尝试dispose方法。这是一个完全可以接受的模式和方式,说我完成了这个,去除它,允许长时间运行的线程完成。