Проверка зависания процесса Office при использовании автоматизации Office - PullRequest
3 голосов
/ 13 августа 2008

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

Ответы [ 3 ]

2 голосов
/ 21 августа 2008

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

Запуск в качестве службы затрудняет очистку. Например, с тем, что вы используете в качестве службы, выживите, убив заведомое слово или превосходя. Возможно, вам придется убить службу. Остановится ли ваша служба, если слово или excel находятся в этом состоянии.

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

Лучший способ определить, зависла ли она, - попросить ее сделать то, что она должна делать, и проверить результаты. Мне нужно знать больше о том, что он на самом деле делает.

Вот некоторые команды, которые нужно использовать в пакетном файле для очистки (обе должны быть в пути):

  • sc stop servicename - останавливает службу с именем servicename
  • sc start servicename - запускает службу с именем servicename
  • sc query servicename - запрашивает статус servicename

  • taskkill / F / IM excel.exe - завершает работу всех экземпляров excel.exe

1 голос
/ 13 августа 2008

Я помню, как делал это несколько лет назад, поэтому я говорю о Office XP или 2003 году, а не 2007.

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

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

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

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

Роб Г

P.S. Я мог бы даже выкопать код в моих архивах, если ты не придешь!

0 голосов
/ 13 августа 2008

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

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

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

...