使用Office Automation时检查Office进程是否挂起
使用Office Automation时是否可以检查Microsoft Office进程(即Word,Excel)是否已挂起?另外,如果进程已挂起,是否可以终止它?
解决方案
回答
我可以回答后半部分。如果我们在代码中引用了该应用程序对象,则可以在其上简单地调用" Quit":
private Microsoft.Office.Interop.Excel.Application _excel; // ... do some stuff ... _excel.Quit();
为了检查挂起的进程,我想我们想尝试从应用程序中获取一些数据,看看是否在合理的时间范围内得到了结果(检查计时器或者其他线程或者其他东西)。不过,也许有更好的方法。
回答
我记得几年前这样做,所以我说的是Office XP或者2003年,而不是2007年。
显然,如今自动化的更好解决方案是使用System.IO.Packaging命名空间使用描述docx等的新XML格式。
那时,我曾经注意到,每当MSWord踢出水桶并且吃饱了,机器上就会运行一个名为" Dr. Watson"的进程。这是我的第一个线索,是Word绊倒了。有时我可能会看到多个WINWORD.EXE,但是我的代码只是用来扫描好的Doctor。一旦看到(在代码中),我就杀死了所有WINWORD.EXE进程,该进程本身就是好医生,然后重新启动了折磨Word的过程:-)
希望能给我们一些有关寻找什么的线索。
一切顺利,
罗布·G
P.S.如果我们做错了,我什至还可以在档案中挖掘代码!
回答
让我开始说,我不建议我们在服务器上的服务中执行此操作,但我会尽力回答这些问题。
作为服务运行很难清理。例如,使用我们作为服务运行的服务,可以杀死一个常识或者擅长的语言。我们可能必须终止服务。如果word或者excel处于这种状态,服务会停止吗?
尝试测试它是否挂起的一个问题是,测试可能会导致一个新的word实例启动并工作,而该服务正在运行的实例仍然会挂起。
确定它是否挂起的最好方法是要求它执行应做的事情并检查结果。我需要更多地了解它的实际作用。
以下是在批处理文件中用于清除的一些命令(均应在路径中):
- sc stop servicename-停止名为servicename的服务
- sc start servicename-启动名为servicename的服务
- sc查询servicename-查询servicename的状态
- taskkill / F / IM excel.exe-终止excel.exe的所有实例