Проверьте, не зависает ли офисный процесс при использовании автоматизации управления

StackOverflow https://stackoverflow.com/questions/9905

Вопрос

Есть ли способ проверить, работает ли процесс Microsoft Office (т. е.Word, Excel) зависал при использовании Office Automation?Кроме того, если процесс зависает, есть ли способ завершить его?

Это было полезно?

Решение

Позвольте мне начать с того, что я не рекомендую делать это в сервисе на сервере, но я сделаю все возможное, чтобы ответить на вопросы.

Запуск в качестве службы затрудняет очистку.Например, с тем, что у вас запущено как сервис, можно выжить, убив зависший word или 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.

Очевидно, что лучшим решением для автоматизации в наши дни является использование нового формата XML, который описывает docx и т.д., Используя пространство имен System.IO.Packaging.

Тогда я часто замечал, что всякий раз, когда MSWord сдавался и с него было достаточно, процесс под названием "Dr.Ватсон" был запущен на компьютере.Это была моя первая подсказка, что Word споткнулся и упал.Иногда я могу увидеть больше одного WINWORD.EXE, но мой код просто использовался для поиска доброго Доктора.Как только я увидел это (в коде), я убил всех WINWORD.EXE обрабатывает сам добрый Доктор, и перезапускает процесс истязания Word :-)

Надеюсь, это даст вам некоторые подсказки относительно того, на что следует обратить внимание.

Всего наилучшего,

Роб Джи

P.S.Возможно, я даже смогу откопать код в своих архивах, если вы не подойдете вовремя!

Я могу ответить на вторую половину;если у вас есть ссылка на объект приложения в вашем коде, вы можете просто вызвать для него "Quit":

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

Для проверки зависшего процесса, я бы предположил, что вы захотите попытаться получить некоторые данные из приложения и посмотреть, получите ли вы результаты в разумные сроки (проверьте таймер, другой поток или что-то в этом роде).Хотя, вероятно, есть способ получше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top