Bessere Lösung?



  • Hallo,
    ich hatte heute so etwas:

    var before = Process.GetProcessesByName("EXCEL").Select(p => p.Id);
    _application = new Excel.Application();
    var after = Process.GetProcessesByName("EXCEL").Select(p => p.Id);
    _process = Process.GetProcessById(after.First(processId => !before.Contains(processId)));
    

    Durch "new Excel.Application" wird Excel als Anwendung gestartet. Das Problem ist, auch mit Aufruf der "Application.Quit" Funktion, Release der COM Objekte durch Marshall und zusätzlichem null setzen, bleibt der Prozess offen und ich muss ihn manuell "Killen". Da Excel an sich aber schon als Anwendung laufen kann, sogar mehrmals, muss ich aber den richtigen Prozess beenden, da alle den gleichen Namen haben. Ich schmeiß also alle in eine Liste, starte den neuen Prozess, füge nochmal alle in eine seperate Liste und schaue, welcher Prozess in der alten Liste nicht vorhanden ist.
    Meine Frage ist eher allgemein, als auf dieses Beispiel bezogen. Wie würdet ihr ein neues Element erkennen? Vielleicht mit einer Observerable Collection oder sowas? Meine Lösung funktioniert zwar, aber ich bin etwas unzufrieden. Bei ein paar Excel Prozessen macht das nicht aus, aber wenn ich solch einen Fall auf tausende Objekte übertrage, ist das was anderes.

    mfg



  • Wobei ich doch auch gerne eine Lösung zu meinem Beispiel sehen würde 🙂



  • BeautyLösung schrieb:

    Bei ein paar Excel Prozessen macht das nicht aus, aber wenn ich solch einen Fall auf tausende Objekte übertrage, ist das was anderes.

    after.First(processId => !before.Contains(processId))
    

    Wenn sich der quadratische Aufwand dieses Ausdrucks negativ bemerkbar macht, kannst Du immer noch mit einer HashSet arbeiten.

    HashSet<int> after = ...;
    after.ExceptWith(before);
    


  • BeautyLösung schrieb:

    Das Problem ist, auch mit Aufruf der "Application.Quit" Funktion, Release der COM Objekte durch Marshall und zusätzlichem null setzen, bleibt der Prozess offen und ich muss ihn manuell "Killen".

    Du musst alle COM Objekte explizit freigeben, die du direkt oder indirekt angefordert hast. Auch irgendwelche Zwischenobjekte, Listen, evtl. Eigenschaften usw. Ist manchmal nicht ganz einfach, aber dann beendet sich Excel. Oder war zumindest früher so, so vor 5-8 Jahren.


Log in to reply