C# 主窗体关闭后应用程序进程不退出-使用ApplicationContext

C# 主窗体关闭后应用程序进程不退出-使用ApplicationContext,c#,winforms,process,exit,applicationcontext,C#,Winforms,Process,Exit,Applicationcontext,我有一个windows窗体应用程序,关闭主窗体后,进程不会退出 我使用ApplicationContext是因为我有一个生成主表单的演示者 Application.Run(新的ApplicationContext(Instance.InitPresentationManager()) 出于调试目的,我覆盖了DestroyHandle和OnHandleDestroyed方法。 在那里我可以看到DestroyHandle被调用,但OnHandleDestroyed没有! 这就是为什么我的进程仍在运行

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

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

Application.Run(新的ApplicationContext(Instance.InitPresentationManager())

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

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

这怎么可能

备注:

  • OnHandleDestroy仅在RecreatingHandle为true时才在开始时调用
  • 当附加到进程并断开所有线程时,主线程仍在应用程序中
  • 我甚至附加了一个内存分析器,它告诉我,我的主窗体已经没有活动实例了
  • 主窗体中的Application.Exit起作用并处理症状,但不处理问题本身
  • 重新启动计算机后,它可以正常工作一段时间,但最终问题再次出现
  • Win 7 64位,VS 2010、.net 4.0

问题在于,表单关闭并不一定意味着应用程序应该终止当前正在执行的操作。(想想写日志文件、关闭通信流等)

一个线程有一个属性
IsBackground
(请参阅),它有效地表示是否允许在中间操作中终止它。检查所有正在运行的线程,确保它们使用适当的后台线程标记运行


在应用程序上下文上尝试dispose方法。这是一种完全可以接受的模式,表示我已完成此操作,继续并摆脱它,以允许长时间运行的线程完成。

使用应用程序运行。运行这必然意味着当表单关闭时,应用程序必须退出,请参阅MSDN:Terminate!=出口Terminate是“停止你现在正在做的事情”。退出是“完成时完成”,这是我在问题中提到的结束。主线程仍在运行。因此,应用程序不会退出。更糟糕的是,MSDN文档中似乎有错误,它们声明应用程序。运行正在等待表单关闭事件。我检查了他们正在等待处理销毁事件的源代码-在我的情况下,这是不触发的。在您的主窗体中正在进行什么处理?你有开始任何线程吗?你能提供一个简单的源代码示例吗?主窗体或多或少有些愚蠢。只是GUI的东西和注册按钮上的事件处理程序等等。这就是整个presenter实现将业务逻辑与GUI控件和表单分开的原因。