Frage

Gibt es eine Möglichkeit zu überprüfen, ob ein Microsoft Office-Prozess (z. B.Word, Excel) ist bei der Verwendung von Office Automation hängengeblieben?Gibt es außerdem eine Möglichkeit, den Prozess zu beenden, wenn er hängen bleibt?

War es hilfreich?

Lösung

Lassen Sie mich zunächst sagen, dass ich nicht empfehle, dies in einem Dienst auf einem Server zu tun, aber ich werde mein Bestes tun, um die Fragen zu beantworten.

Die Ausführung als Dienst erschwert die Bereinigung.Überleben Sie zum Beispiel mit dem, was Sie als Dienst ausgeführt haben, das Töten eines hängengebliebenen Wortes oder einer Excel-Datei.Möglicherweise müssen Sie den Dienst beenden.Wird Ihr Dienst beendet, wenn sich Word oder Excel in diesem Zustand befinden?

Ein Problem beim Testen, ob es hängt, besteht darin, dass Ihr Test dazu führen könnte, dass eine neue Instanz von Word gestartet wird und funktioniert, während die Instanz, die der Dienst ausführt, immer noch hängen bleibt.

Der beste Weg, um festzustellen, ob es hängen bleibt, besteht darin, es zu bitten, das zu tun, was es tun soll, und die Ergebnisse zu überprüfen.Ich müsste mehr darüber wissen, was es tatsächlich tut.

Hier sind einige Befehle, die Sie in einer Batch-Datei zum Bereinigen verwenden können (beide sollten sich im Pfad befinden):

  • sc stop servicename – stoppt den Dienst namens servicename
  • sc start servicename – startet den Dienst namens servicename
  • sc query servicename – Fragt den Status von servicename ab

  • taskkill /F /IM excel.exe – beendet alle Instanzen von excel.exe

Andere Tipps

Ich erinnere mich, dass ich das vor ein paar Jahren gemacht habe – ich spreche also von Office XP oder 2003 Days, nicht von 2007.

Eine bessere Lösung für die Automatisierung ist heutzutage offensichtlich die Verwendung des neuen XML-Formats, das docx usw. mithilfe des System.IO.Packaging-Namespace beschreibt.

Damals fiel mir immer auf, dass immer dann, wenn MSWord die Nase voll hatte und genug hatte, ein Prozess namens „Dr.Watson“ lief auf der Maschine.Das war mein erster Hinweis darauf, dass Word gestolpert und umgefallen war.Manchmal sehe ich vielleicht mehr als einen WINWORD.EXE, aber mein Code diente nur dazu, nach dem guten Doktor zu suchen.Als ich das (im Code) sah, habe ich alle getötet WINWORD.EXE verarbeitet den guten Doktor selbst und hat den Prozess der Folterung von Word neu gestartet :-)

Ich hoffe, das gibt Ihnen einige Hinweise darauf, wonach Sie suchen müssen.

Alles Gute,

Rob G

P.S.Vielleicht kann ich den Code sogar in meinen Archiven ausgraben, wenn Sie nicht richtig liegen!

Ich kann die zweite Hälfte beantworten;Wenn Ihr Code einen Verweis auf das Anwendungsobjekt enthält, können Sie einfach „Quit“ aufrufen:

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

Um nach einem hängengebliebenen Prozess zu suchen, würden Sie wahrscheinlich versuchen, einige Daten aus der Anwendung abzurufen und zu sehen, ob Sie innerhalb eines angemessenen Zeitrahmens Ergebnisse erhalten (überprüfen Sie einen Timer oder einen anderen Thread oder so etwas).Es gibt jedoch wahrscheinlich einen besseren Weg.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top