有没有办法在使用 Office 自动化时检查 Microsoft Office 进程(即 Word、Excel)是否挂起?另外,如果进程挂起,有没有办法终止它?
3 回答
让我开始说我不建议在服务器上的服务中这样做,但我会尽力回答问题。
作为服务运行使清理变得困难。例如,您作为服务运行的内容可以杀死一个悬而未决的单词或 excel。您可能不得不终止服务。如果 word 或 excel 处于这种状态,您的服务会停止吗?
尝试测试它是否挂起的一个问题是,您的测试可能会导致一个新的 word 实例启动并工作,而服务正在运行的那个实例仍然会被挂起。
确定它是否挂起的最好方法是要求它做它应该做的事情并检查结果。我需要更多地了解它实际上在做什么。
以下是在批处理文件中用于清理的一些命令(两者都应该在路径中):
- sc stop servicename - 停止名为 servicename 的服务
- sc start servicename - 启动名为 servicename 的服务
sc query servicename - 查询 servicename 的状态
taskkill /F /IM excel.exe - 终止所有 excel.exe 实例
我记得几年前这样做过 - 所以我说的是 Office XP 或 2003 天,而不是 2007。
显然,如今更好的自动化解决方案是使用使用 System.IO.Packaging 命名空间描述 docx 等的新 XML 格式。
那时,我曾经注意到,每当 MSWord 踢完桶并且受够了,机器上就会运行一个名为“Dr. Watson”的进程。这是我第一个知道 Word 绊倒的线索。有时我可能会看到不止一个WINWORD.EXE,但我的代码只是用来扫描好医生。一旦我看到(在代码中),我自己杀死了所有WINWORD.EXE进程好医生,并重新启动了折磨 Word 的过程:-)
希望能给你一些关于寻找什么的线索。
祝一切顺利,
抢G
PS如果你不来的话,我什至可以挖掘出我档案中的代码!
我可以回答后半部分;如果您在代码中引用了应用程序对象,您可以简单地在其上调用“退出”:
private Microsoft.Office.Interop.Excel.Application _excel;
// ... do some stuff ...
_excel.Quit();
为了检查挂起的进程,我猜你想尝试从应用程序中获取一些数据,看看你是否在合理的时间范围内得到结果(检查计时器或其他线程或其他东西)。不过可能有更好的方法。