关于不可知的语言:使用Office Automation时检查Office进程是否挂起

关于不可知的语言:使用Office Automation时检查Office进程是否挂起

Check for hung Office process when using Office Automation

使用Office Automation时是否可以检查Microsoft Office进程(即Word,Excel)是否已挂起? 此外,如果进程已挂起,是否可以终止它?


让我开始说,我不建议您在服务器上的服务中执行此操作,但我会尽力回答这些问题。

作为一项服务运行很难清理。例如,使用您作为服务运行的服务而生存下来,可以消除一句悬念或擅长的单词。您可能必须终止服务。如果word或excel处于这种状态,您的服务会停止吗?

尝试测试它是否被挂起的一个问题是,您的测试可能导致一个新的word实例启动并工作,而服务正在运行的那个实例仍然被挂起。

确定其是否挂起的最佳方法是要求它执行应做的事情并检查结果。我需要更多地了解它的实际作用。

以下是在批处理文件中用于清除的一些命令(均应在路径中):

  • sc stop servicename-停止名为servicename的服务
  • sc start servicename-启动名为servicename的服务
  • sc查询servicename-查询servicename的状态

  • taskkill / F / IM excel.exe-终止excel.exe的所有实例


我记得几年前就这样做过-所以我说的是Office XP或2003,而不是2007。

显然,如今自动化的更好解决方案是使用System.IO.Packaging命名空间使用描述docx等的新XML格式。

那时,我曾经注意到,每当MSWord踢出水桶并且吃饱了,机器上就会运行一个名为" Dr. Watson"的进程。这是我的第一个线索,是Word绊倒了。有时我可能会看到多个WINWORD.EXE,但是我的代码只是用来扫描好的Doctor。一旦看到(在代码中),我就杀死了所有WINWORD.EXE进程,他本人是好的Doctor,然后重新启动了折磨Word的过程:-)

希望能给您一些有关寻找什么的线索。

祝一切顺利,

罗布·G

附:如果您做得不对,我什至可以挖掘出档案中的代码!


我可以回答后半部分。如果您在代码中引用了该应用程序对象,则可以在其上简单地调用" Quit":

1
2
3
private Microsoft.Office.Interop.Excel.Application _excel;
// ... do some stuff ...
_excel.Quit();

为了检查挂起的进程,我猜您想尝试从应用程序中获取一些数据,看看是否在合理的时间范围内得到了结果(检查计时器或其他线程或其他东西)。不过,也许有更好的方法。


推荐阅读