C# 为什么杀死Excel进程是件坏事?

C# 为什么杀死Excel进程是件坏事?,c#,.net,vb.net,excel,excel-interop,C#,.net,Vb.net,Excel,Excel Interop,我看过很多关于如何确保Excel在您想要退出时退出,并且该过程无法保持活力的文章和问题。描述问题和Microsoft建议的解决方案。基本上: “关闭文件” '退出Excel xlApp.quit() "放垃圾,收垃圾", System.Runtime.InteropServices.Marshal.FinalEleaseComObject(xlApp) GC.Collect() GC.WaitForPendingFinalizers() 许多人不建议终止进程;看见 及 另一方面,许多人不建议使

我看过很多关于如何确保Excel在您想要退出时退出,并且该过程无法保持活力的文章和问题。描述问题和Microsoft建议的解决方案。基本上:

“关闭文件”
'退出Excel
xlApp.quit()
"放垃圾,收垃圾",
System.Runtime.InteropServices.Marshal.FinalEleaseComObject(xlApp)
GC.Collect()
GC.WaitForPendingFinalizers()
许多人不建议终止进程;看见 及

另一方面,许多人不建议使用GC.Collect。看

根据我的经验,终止流程是确保Excel消失的最快、最简单的方法。我的代码只杀死它启动的确切进程,没有其他进程。我确保关闭所有打开的工作簿,退出应用程序并释放xlApp对象。最后,我检查进程是否仍然存在,如果仍然存在,则将其杀死

_
私有共享函数GetWindowThreadProcessId(ByVal hWnd作为IntPtr_
ByRef lpdwProcessId(作为整数)作为整数
端函数
子testKill()
'启动应用程序
Dim xlApp As Object=CreateObject(“Excel.Application”)
“使用Excel做一些工作
'关闭所有打开的文件
“拿窗把手
Dim xlHWND为整数=xlApp.hwnd
'在调用GetWindowThreadProcessId之后,它将具有进程ID
Dim ProcIdXL为整数=0
'获取进程ID
GetWindowThreadProcessId(xlHWND,ProcIdXL)
“了解流程
Dim xproc As Process=Process.GetProcessById(ProcIdXL)
'退出Excel
xlApp.quit()
"释放",
System.Runtime.InteropServices.Marshal.FinalEleaseComObject(xlApp)
“一事无成
xlApp=无
'如果仍在运行,请终止进程
如果未退出xproc.has,则
xproc.Kill()
如果结束
端接头
我看到很多人说,扼杀流程是不好的,但我还没有看到任何定性的答案来解释原因。特别是在确保文件已关闭后,Excel已退出,我们将只终止启动的确切进程。我的问题是,终止Excel进程的潜在问题是什么。这会影响表现吗?它会伤害你吗

许多人也会说,有了好的编码,我不必扼杀进程。也许吧,但这并不能回答在关闭文件、退出Excel并释放对象之后“为什么终止进程不好”的问题;为什么仅仅是确保这个过程已经结束是件坏事呢

编辑:还有Excel退出后实际剩下的是什么?如果Excel是可见的,它似乎会正常退出,从视图和任务栏中消失。那么Excel是否真的退出了呢。在我看来,Excel确实退出了,我们只有一个空的进程外壳在运行。有人能对此发表评论吗

编辑:我很感兴趣地注意到通过GC.Collect()的GC(也称为垃圾收集) 实际上,GC.WaitForPendingFinalizers()将释放Excel退出后留下的进程shell。这是否支持我的假设,即空的进程外壳实际上是垃圾


编辑:刚刚找到一个关于这个问题的优秀网站:

看,事实是,如果可能的话,你应该让应用程序正常退出。杀掉应用程序是最后的手段。我知道你确信,在这种情况下,你认为这样做没有错,也许你是对的。即使杀死它对你的系统绝对没有负面影响,这也不会改变这样做是错误的事实。这就像触犯了法律,因为你知道你不会被抓住,而且这是一种没有受害者的犯罪

然而,也有一些潜在的副作用,你可能没有意识到。例如,当您强制终止某个应用程序时,操作系统可能会保留该应用程序的崩溃数据。或者它可能会将崩溃遥测发送给微软。实际上,你是在告诉微软,应用程序崩溃的频率比实际情况要高,这导致它们的崩溃统计数据略有偏差

另一个可能的副作用是注册表配置单元可能无法正确卸载。您可能不时在事件日志中看到此错误。它通常发生在应用程序被强制关闭并且没有正确关闭注册表句柄时


即使这些事情都没有发生,你也不知道未来版本的操作系统会做什么。今天起作用的,明天可能不起作用。这就是为什么您应该始终遵循记录在案的API和指南,因为它们通常会非常努力地支持他们发布的内容,但是,通常不会很努力地支持他们特别告诉您不要做的事情。

当您使用自动化从另一个应用程序控制Office应用程序时,您偶尔需要像您这样终止Office进程,以避免“泄漏”不可见的Office应用程序。这是一个不幸的结果,因为Office应用程序试图同时充当最终用户应用程序和自动化服务器

在服务器端使用Word时,我采用了与您大致相同的解决方案(不要问为什么)。无论我们在正确关闭Word方面付出了多少努力,服务器上都会累积越来越多的“不可见”Word进程。唯一好的解决方案是杀死那些在被指示退出后不会终止的进程

当Windows进程被终止时,该进程使用的所有资源都会被操作系统清除,例如文件和其他操作系统句柄(如注册表句柄)被关闭,内存被释放等。从操作系统的角度来看,进程终止时不会有任何泄漏

但是,应用程序可能会创建它打算在正常关闭期间删除的临时文件。随着时间的推移,这些孤立文件可能会占用越来越多的磁盘空间。此外,如果用户在应用程序中打开了其他文件,则