Pregunta

¿Hay alguna manera de comprobar si un proceso de Microsoft Office (es decir,Word, Excel) se ha bloqueado al usar Office Automation?Además, si el proceso se bloquea, ¿hay alguna forma de finalizarlo?

¿Fue útil?

Solución

Permítanme comenzar diciendo que no recomiendo hacer esto en un servicio en un servidor, pero haré lo mejor que pueda para responder las preguntas.

Ejecutarlo como servicio dificulta la limpieza.Por ejemplo, con lo que tiene ejecutándose como servicio, sobreviva eliminando una palabra colgada o sobresalga.Es posible que esté en condiciones de tener que cancelar el servicio.¿Su servicio se detendrá si Word o Excel se encuentran en este estado?

Un problema al intentar probar si está bloqueado es que su prueba podría provocar que se inicie y funcione una nueva instancia de Word, mientras que la que está ejecutando el servicio aún estaría bloqueada.

La mejor manera de determinar si está colgado es pedirle que haga lo que se supone que debe hacer y comprobar los resultados.Necesitaría saber más sobre lo que realmente está haciendo.

Aquí hay algunos comandos para usar en un archivo por lotes para la limpieza (ambos deben estar en la ruta):

  • sc stop servicename - detiene el servicio llamado servicename
  • sc start servicename - inicia el servicio llamado servicename
  • sc query servicename - Consulta el estado de servicename

  • taskkill /F /IM excel.exe - finaliza todas las instancias de excel.exe

Otros consejos

Recuerdo haber hecho esto hace unos años, así que estoy hablando de Office XP o 2003 días, no de 2007.

Obviamente, una mejor solución para la automatización hoy en día es utilizar el nuevo formato XML que describe docx, etc. utilizando el espacio de nombres System.IO.Packaging.

En aquel entonces, solía notar que cada vez que MSWord estiraba la pata y se cansaba, aparecía un proceso llamado "Dr.Watson" se estaba ejecutando en la máquina.Esta fue mi primera pista de que Word había tropezado y caído.A veces puedo ver más de uno. WINWORD.EXE, pero mi código solo solía buscar al buen Doctor.Una vez que vi eso (en código), maté a todos WINWORD.EXE procesa al propio buen Doctor y reinicia el proceso de torturar a Word :-)

Espero que te dé algunas pistas sobre qué buscar.

Mis mejores deseos,

Rob G.

PD¡Quizás incluso pueda desenterrar el código de mis archivos si no lo haces bien!

Puedo responder la segunda mitad;Si tiene una referencia al objeto de la aplicación en su código, simplemente puede llamar a "Salir" en él:

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

Para verificar si hay un proceso bloqueado, supongo que querrá intentar obtener algunos datos de la aplicación y ver si obtiene resultados en un período de tiempo razonable (verifique un temporizador u otro hilo o algo así).Probablemente haya una manera mejor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top