Domanda

Esiste un modo per verificare se un processo di Microsoft Office (ad es.Word, Excel) si è bloccato durante l'utilizzo di Office Automation?Inoltre, se il processo si blocca, esiste un modo per terminarlo?

È stato utile?

Soluzione

Vorrei iniziare dicendo che non consiglio di farlo in un servizio su un server, ma farò del mio meglio per rispondere alle domande.

L'esecuzione come servizio rende difficile la pulizia.Ad esempio, con quello che hai in esecuzione come servizio, sopravvivi uccidendo una parola appesa o eccellendo.Potresti essere nella posizione di dover interrompere il servizio.Il tuo servizio si interromperà se Word o Excel si trovano in questo stato.

Un problema con il tentativo di verificare se è bloccato è che il test potrebbe causare l'avvio e il funzionamento di una nuova istanza di Word, mentre quella su cui è in esecuzione il servizio rimarrebbe comunque bloccata.

Il modo migliore per determinare se è bloccato è chiedergli di fare quello che dovrebbe fare e controllare i risultati.Avrei bisogno di sapere di più su cosa sta effettivamente facendo.

Ecco alcuni comandi da utilizzare in un file batch per la pulizia (entrambi dovrebbero essere nel percorso):

  • sc stop nomeservizio: interrompe il servizio denominato nomeservizio
  • sc start nomeservizio: avvia il servizio denominato nomeservizio
  • sc query servicename: interroga lo stato di servicename

  • taskkill /F /IM excel.exe: termina tutte le istanze di excel.exe

Altri suggerimenti

Ricordo di averlo fatto qualche anno fa, quindi sto parlando di Office XP o dei giorni 2003, non del 2007.

Ovviamente una soluzione migliore per l'automazione al giorno d'oggi è utilizzare il nuovo formato XML che descrive docx ecc. utilizzando lo spazio dei nomi System.IO.Packaging.

Allora, notavo che ogni volta che MSWord tirava le cuoia e ne aveva abbastanza, un processo chiamato "Dr.Watson" era in esecuzione sulla macchina.Questo è stato il mio primo indizio che Word fosse inciampato e caduto.A volte potrei vederne più di uno WINWORD.EXE, ma il mio codice veniva utilizzato solo per cercare il buon dottore.Una volta che l'ho visto (nel codice), ho ucciso tutto WINWORD.EXE processa il buon Dottore in persona e riavvia il processo di tortura di Word :-)

Spero che questo ti dia qualche indizio su cosa cercare.

Ti auguro il meglio,

RobG

PSPotrei anche riuscire a scovare il codice nei miei archivi se non vieni bene!

Posso rispondere alla seconda metà;se hai un riferimento all'oggetto application nel tuo codice, puoi semplicemente chiamare "Quit" su di esso:

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

Per verificare la presenza di un processo sospeso, immagino che vorresti provare a ottenere alcuni dati dall'applicazione e vedere se ottieni risultati in un intervallo di tempo ragionevole (controlla un timer o un altro thread o qualcosa del genere).Probabilmente c'è un modo migliore però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top