Verifique se há processos do Office travados ao usar o Office Automation
-
08-06-2019 - |
Pergunta
Existe uma maneira de verificar se um processo do Microsoft Office (ou seja,Word, Excel) travou ao usar o Office Automation?Além disso, se o processo travar, existe uma maneira de encerrá-lo?
Solução
Deixe-me começar dizendo que não recomendo fazer isso em um serviço em um servidor, mas farei o possível para responder às perguntas.
A execução como um serviço dificulta a limpeza.Por exemplo, com o que você está executando como serviço, sobreviva matando uma palavra travada ou excel.Você pode estar em posição de interromper o serviço.Seu serviço será interrompido se o Word ou Excel estiver neste estado.
Um problema ao tentar testar se ele está travado é que seu teste pode fazer com que uma nova instância do Word seja inicializada e funcione, enquanto aquela em que o serviço está sendo executado ainda estaria travada.
A melhor maneira de determinar se ele está travado é pedir que ele faça o que deveria estar fazendo e verificar os resultados.Eu precisaria saber mais sobre o que ele realmente está fazendo.
Aqui estão alguns comandos para usar em um arquivo em lote para limpeza (ambos devem estar no caminho):
- sc stop servicename - interrompe o serviço chamado servicename
- sc start servicename - inicia o serviço chamado servicename
sc query servicename - Consulta o status do servicename
taskkill /F /IM excel.exe - encerra todas as instâncias do excel.exe
Outras dicas
Lembro-me de fazer isso há alguns anos - estou falando do Office XP ou de 2003 dias, não de 2007.
Obviamente, uma solução melhor para automação atualmente é usar o novo formato XML que descreve docx etc. usando o namespace System.IO.Packaging.
Naquela época, eu costumava notar que sempre que o MSWord chegava ao fim e estava farto, um processo chamado "Dr.Watson" estava rodando na máquina.Esta foi minha primeira pista de que Word havia tropeçado e caído.Às vezes eu posso ver mais de um WINWORD.EXE, mas meu código costumava procurar o bom doutor.Assim que vi isso (em código), matei todos WINWORD.EXE processa o próprio bom doutor e reinicia o processo de tortura do Word :-)
Espero que isso lhe dê algumas pistas sobre o que procurar.
Tudo de bom,
Rob G.
P.S.Posso até conseguir desenterrar o código em meus arquivos se você não acertar!
Posso responder à segunda metade;se você tiver uma referência ao objeto do aplicativo em seu código, basta chamar "Quit" nele:
private Microsoft.Office.Interop.Excel.Application _excel;
// ... do some stuff ...
_excel.Quit();
Para verificar se há um processo travado, acho que você gostaria de tentar obter alguns dados do aplicativo e ver se obtém resultados em um período de tempo razoável (verifique um cronômetro ou outro thread ou algo assim).Provavelmente existe uma maneira melhor.