Ich habe den folgenden Code-Abschnitt, wie viele Prozesse sind Excel zu zählen entwickelt derzeit offen:Wenn 'Process.HasExited' eine Ausnahme auslöst, kann ich davon ausgehen, dass der Prozess weg ist?
Func<int> OpenExcelProcessesCount =
() => System.Diagnostics.Process.GetProcessesByName("Excel")
.Where(p => !p.HasExited)
.Count();
Und dann später habe ich die Zählung an verschiedenen Punkten abrufen, mit dem Code wie den folgenden:
int excelAppCount = OpenExcelProcessesCount();
Dieser Code läuft seit Monaten zu 100%. Dann plötzlich, heute ist es konsequent zu geben mir eine Ausnahme, die folgenden Wortlaut:
Exception: ApplicationThreadException Message: Access is denied Stack Trace: at System.Diagnostics.ProcessManager.OpenProcess(Int32
processId, Int32 Zugang, Boolean throwIfExited)
at System.Diagnostics.Process.GetProcessHandle(Int32
Zugang, Boolean throwIfExited)
at System.Diagnostics.Process.get_HasExited() etc...
Grundsätzlich der Anruf an Process.HasExited
(das oben in der Stack-Ablaufverfolgung als System.Diagnostics.Process.get_HasExited()
angezeigt wird) schlägt fehl. Die Fehlermeldung "Zugriff verweigert" klingt, als hätte ich keine Administratorrechte für den Prozess, aber die einzigen vorhandenen Excel-Prozesse würden unter meiner aktuellen Benutzeranmeldung erstellt, und der Benutzer kann immer auf seine eigenen Prozesse zugreifen. Mein .NET-Code läuft ebenfalls unter voller Vertrauenswürdigkeit.
Die Linie, die letztendlich ausfällt, ist System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
. Ich frage mich, ob es für den 'throwIfExited' Parameter in einem Wert von 'true' übergeben wird. Wenn dies der Fall ist, nehme ich an, dass ich den Anruf mit einem try-catch-Block auf Process.HasExited
schützen könnte, und nehme an, dass, wenn dies fehlschlägt, HasExited
tatsächlich "wahr" ist. Aber ist das eine sichere Annahme?
Ich bin unbehaglich machen eine Vermutung wie diese, vor allem seit die Fehlermeldung lautet "Zugriff verweigert". Hat jemand irgendwelche Ideen, wie ich das angehen könnte oder was ich testen könnte, um herauszufinden, was vor sich geht?
Der einzige ähnliche Thread, den ich auf Stack Overflow finden konnte, war der folgende: Why did hasExited throw ‘System.ComponentModel.Win32Exception’?. Die Antwort war:
„Da Sie runas tun, Sie nur Zugriff auf den Griff SYNCHRONIS bekommen, nicht PROCESS_QUERY_INFORMATION Zugang, daher GetExitCodeProcess versagt, die Ergebnisse in hasEnded eine Win32 Ausnahme werfen. "
Ich verstehe diese Antwort nicht wirklich und weiß nicht, ob das in meinem Fall zutrifft, aber ich dachte, ich sollte es erwähnen. Wenn jemand glaubt, dass es wahrscheinlich ist, dass dies die Situation ist, der ich gegenüberstehe, dann würde ich es sehr schätzen, wenn jemand versuchen würde, diese Antwort für mich zu klären. (Ich bin ein Excel-Programmierer, ich habe nicht viel Erfahrung mit Prozessen arbeiten.)
Viel Dank im Voraus ...
Update:
Beste ich kann sagen, dies war kompliziert eine einmalige Korruption in irgendeiner Form.Die Probleme, mit denen ich konfrontiert war, wurden immer bizarrer, da es bei einem perfekt funktionierenden Satz von Komponententests zu Ausfällen an anderen "unmöglichen" Orten kam. Ein einfacher Neustart korrigierte dieses Problem und alles andere, was mir bevorstand.
Meine beste Vermutung ist, dass ich eine Art bizarre Korruption hatte. Vielleicht war der ROT korrupt, und/oder ich hatte eine hängende Excel-Instanz, die so korrupt war, dass selbst "Prozess" -Operationen nicht unbedingt stabil waren. Nichts Schlüssiges, aber das ist alles, was ich für jetzt herausfinden kann.
An die Antwortenden, die sich die Zeit genommen haben, antworten und mir helfen, ich danke Ihnen.
„Ich frage mich, ob es in einem Wert von‚true‘für die‚throwIfExited‘Parameter übergeben wird ... das ist eine sichere Annahme? " Nein. Gemäß Reflector übergibt HasExited den Wert false für throwIfExited. Wenn thrumIfExited true wäre, wäre die Ausnahme eine InvalidOperationException mit einer Nachricht, die anzeigt, dass der Prozess beendet wurde. (Entschuldigung, ich habe keine Antwort auf Ihre Frage, aber ich dachte, es war es wert, dies zu erwähnen, so dass Sie keine Zeit mit einer unfruchtbaren Theorie verbracht haben.) – itowlson
Danke, itowlson, ich schätze die Informationen sehr, das hilft definitiv. –