Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我的应用程序在注销/关闭(c#/.net winforms)时不关闭?_C#_.net_Winforms_Com_Shutdown - Fatal编程技术网

为什么我的应用程序在注销/关闭(c#/.net winforms)时不关闭?

为什么我的应用程序在注销/关闭(c#/.net winforms)时不关闭?,c#,.net,winforms,com,shutdown,C#,.net,Winforms,Com,Shutdown,当我注销/关机时,我的winforms应用程序没有很好地关闭。我有一个主窗体,它的结束事件被正确地触发,但一定有其他东西使我的应用程序保持不变。如果我检查Application.OpenForms,只有一个主窗体 棘手的是,问题可能就在这里,我的应用程序使用ShellWindows连接到Internet Explorer,当IE事件触发时,偶尔会打开表单。只有在一个或多个表单被打开和关闭后,我的应用程序才会在关闭时停止关闭 我想我正在清理所有的表单对象等,并适当地调用finalEleaseCom

当我注销/关机时,我的winforms应用程序没有很好地关闭。我有一个主窗体,它的结束事件被正确地触发,但一定有其他东西使我的应用程序保持不变。如果我检查Application.OpenForms,只有一个主窗体

棘手的是,问题可能就在这里,我的应用程序使用ShellWindows连接到Internet Explorer,当IE事件触发时,偶尔会打开表单。只有在一个或多个表单被打开和关闭后,我的应用程序才会在关闭时停止关闭


我想我正在清理所有的表单对象等,并适当地调用finalEleaseComObject(),但我想在某些地方有一些引用使我的进程处于打开状态。有没有办法找出是什么阻止了我的应用程序正常关闭?

如果运行的线程未设置为后台,则应用程序也将保持打开状态。如果您正在创建自己的线程,请确保它们正确终止


如果线程是否完成并不重要,请设置为true。您还可以对线程调用Abort(某种程度上)强制终止它

最可能的原因是,当应用程序的主窗口关闭时,有一个后台线程挂起,而该线程没有关闭。根据您的设置和框架版本,在主线程终止时,后台线程可以使应用程序保持活动状态


在关机期间,windows通常通过向进程上的主窗口发送WM_QUIT来请求每个正在运行的应用程序终止。WinForms很乐意使用此消息关闭主窗口,但如果任何后台线程被保留,实际进程可以继续。

这是一种非常糟糕的方法,但如果您只想杀死任何挂起的线程,您可以使用System.Diagnostics.Process.GetCurrentProcess.threads获取应用程序中运行的所有线程,然后对它们进行枚举并调用Thread.Join()或Thread.Abort()


只需确保不要在您工作的主(UI)线程(接收关闭事件的线程)上调用.Abort()。因此,请确保检查您当前的线程(System.Threading.thread)不是您要中止的线程。

我不会自己启动任何线程,但我确实会收到来自各种IE线程的回调。所以我的代码在多个线程上执行,但我没有启动它们,所以我想阻止它们不是我的工作。你检查过你所有的IE回调是否都将控制权返回到IE吗?您还可以在Visual Studio中检查应用程序中正在运行的线程(调试->窗口->线程)。显然,这可能不是一个线程问题,但这是一个值得关注的地方。我相信情况就是这样:我们正在接收来自COM的多个线程的调用,并在这些线程中创建UI元素。创建UI元素意味着线程不能正确关闭、挂起并阻止应用程序正常关闭。我相信,切换到对所有UI交互使用单个线程将解决问题,但目前我们只是在希望进程关闭时终止它:-/