Есть ли способ проверить, не зависал ли процесс Microsoft Office (например, Word, Excel) при использовании автоматизации Office? Кроме того, если процесс завис, есть ли способ его прекратить?
Позвольте мне начать с того, что я не рекомендую делать это в службе на сервере, но я сделаю все возможное, чтобы ответить на вопросы.
Запуск в качестве службы затрудняет очистку. Например, с тем, что вы используете в качестве службы, вы можете выжить, убив заведомое слово или превзойти себя. Возможно, вам придется убить службу. Остановится ли ваша служба, если слово или excel находятся в этом состоянии.
Одна из проблем, связанных с попыткой проверить, зависла ли она, состоит в том, что ваш тест может вызвать запуск и работу нового экземпляра word, в то время как тот, на котором работает служба, все еще будет зависать.
Лучший способ определить, зависла ли она, - попросить ее сделать то, что она должна делать, и проверить результаты. Мне нужно знать больше о том, что он на самом деле делает.
Вот некоторые команды, которые нужно использовать в командном файле для очистки (обе должны быть в пути):
- sc stop servicename - останавливает службу с именем servicename
- sc start servicename - запускает службу с именем servicename
sc query servicename - запрашивает статус servicename
taskkill / F / IM excel.exe - завершает все экземпляры excel.exe
Я могу ответить на второй половине; если в вашем коде есть ссылка на объект приложения, вы можете просто вызвать «Quit»:
private Microsoft.Office.Interop.Excel.Application _excel;
// ... do some stuff ...
_excel.Quit();
Для проверки зависшего процесса, я думаю, вы захотите попытаться получить некоторые данные из приложения и посмотреть, получите ли вы результаты в разумные сроки (проверьте таймер или другой поток или что-то в этом роде). Хотя, вероятно, есть лучший способ.
Я помню, как делал это несколько лет назад, поэтому я говорю о Office XP или 2003 году, а не 2007.
Очевидно, что в наши дни лучшим решением для автоматизации является использование нового формата XML, описывающего docx и т. Д., С использованием пространства имен System.IO.Packaging.
В то время я замечал, что всякий раз, когда MSWord пинал ведро и ему было достаточно, на машине запускался процесс под названием «Доктор Ватсон». Это была моя первая подсказка, что Слово споткнулось и упало. Иногда я вижу несколько WINWORD.EXE , но мой код просто используется для поиска хорошего Доктора. Как только я увидел это (в коде), я убил все процессы WINWORD.EXE самого хорошего Доктора и перезапустил процесс пыток Word :-)
Надеюсь, что это даст вам некоторые подсказки относительно того, что искать.
Всего наилучшего,
Роб Г
PS Я мог бы даже выкопать код в моих архивах, если ты не придешь!