Announcement

Collapse
No announcement yet.

Excel-Prozess bleibt im Taskmanager

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Excel-Prozess bleibt im Taskmanager

    Hallo zusammen,
    ich erstelle wie folgt eine Excelinstanz...

    [highlight=vbnet]
    Dim XLSObj As Microsoft.Office.Interop.Excel.Application
    XLSObj = New Microsoft.Office.Interop.Excel.Application
    With XLSObj
    .....
    'Bearbeitungscode für Exceldatei
    End With
    [/highlight]

    Wenn ich die Bearbeitung meines Exceldatei beendet habe schließe ich wie folgt die Datei und vernichte die Instanz:

    [highlight=vbnet]
    With XLSObj
    '.ActiveWorkbook.SaveAs(Filename:=FileName)
    .ActiveWorkbook.Save()
    .Quit()
    XLSObj = Nothing
    End If
    GC.Collect()
    GC.WaitForPendingFinalizers()
    [/highlight]


    Warum bleibt die Excelinstanz noch im Taskmanager sichtbar.
    Wie bekomme ich es hin das die Excelinstanz komplett weg ist?

  • #2
    Hiho

    Probiers mal mit XLSObj = Nothing vor dem GC.Collect()... Der Garbage Collector entfernt, soweit ich weis nur Objekte aus dem Speichern auf welche keine Referenzen mehr existieren...

    Eine "unsaubere" Möglichkeit wäre es, die aktiven Threads nach dem Excel-Thread zu durchsuchen und via Kill() zu beenden...

    Gruss
    Reto

    Comment


    • #3
      Hallo ReatKay,

      Der Garbage Collector entfernt, soweit ich weis nur Objekte aus dem Speichern auf welche keine Referenzen mehr existieren...
      Stimmt.


      mfG Gü
      "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

      Comment


      • #4
        Originally posted by gfoidl View Post
        Hallo ReatKay,


        Stimmt.


        mfG Gü

        Joo, eine Eigenschaft die alle GBs so haben...alles andere wäre etwas störend
        Christian

        Comment


        • #5
          Ja, bin noch relativ neu auf VB.NET - ich habe aber ziemlich viel JAVA-Erfahrung - deshalb das: soviel ich weiss ^^

          Irgendwie ja auch logisch: Ein GC der Objekte entfernt, die noch referenziert werden = Exception-Hölle.

          Comment


          • #6
            Hallo zusammen,
            wie ihr oben seht...

            With XLSObj
            '.ActiveWorkbook.SaveAs(Filename:=FileName)
            .ActiveWorkbook.Save()
            .Quit()
            XLSObj = Nothing
            End If
            GC.Collect()
            GC.WaitForPendingFinalizers()
            hab ich XLSObj = Nothing gesetzt.
            Wo kann das Problem sonst liegen...???

            Habt Ihr das bei Euch auch mal getestet ? Ist das bei Euch auch so ?

            Comment


            • #7
              wo ist das End With?

              Zum rest kann ich leider nichts sagen, außer hast du bedacht was passiert wenn ein User bereits ein Excel File geöffnet hat und du Quit ausführst?
              Unsere Jugend ist unerträglich, unverantwortlich und entsetzlich anzusehen! - Aristoteles

              Comment


              • #8
                Excel ist generell schwierig zu beenden. Das liegt wohl an den Interop Libraries. Dazu gibt's auch viele Themen in anderen Foren. Ich selber habe das auch schon gemacht und hatte/habe auch des öfteren Schwierigkeiten beim Beenden. Ich glaube eine 100% Lösung gibt es nicht.

                So sieht die Klasse aus die ich mir als Wrapper für ein Excel Workbook geschrieben habe:

                [highlight=c#]
                class ExcelWorkbook : IDisposable
                {
                #region Fields

                ApplicationClass _excel = null;
                Workbooks _workbooks = null;
                Workbook _workbook = null;
                object n = System.Reflection.Missing.Value;

                #endregion

                #region Constructors

                public ExcelWorkbook(String fileName)
                {
                FileInfo fi = new FileInfo(fileName);

                if (!fi.Exists)
                throw new FileNotFoundException();

                if (fi.Extension != ".xls")
                throw new ArgumentException("'" + fi.FullName + "' does not end with .xls");

                try
                {
                string ImportListFilename = fi.FullName;

                _excel = new ApplicationClass();
                _excel.Visible = false;

                _workbooks = _excel.Workbooks;
                _workbook = _workbooks.Open(ImportListFilename, n, n, n, n, n, n, n, n, n, n, n, n, n, n);
                }
                catch (ExcelException ex)
                {
                throw ex;
                }
                catch (Exception ex)
                {
                throw new ExcelException("Excel has raised an Exception:\n\n" + ex.Message, ex);
                }
                }

                #endregion

                #region Public Properties

                public Workbook Workbook { get { return _workbook; } }

                #endregion

                #region IDisposable Member

                public void Dispose()
                {
                GC.Collect();
                GC.WaitForPendingFinalizers();
                GC.Collect();
                GC.WaitForPendingFinalizers();

                _workbook.Close(false, n, n);
                ReleaseHelper.NAR(_workbook);
                ReleaseHelper.NAR(_workbooks);

                _excel.Quit();
                ReleaseHelper.NAR(_excel);

                GC.Collect();
                GC.WaitForPendingFinalizers();
                }

                #endregion

                }

                class ReleaseHelper
                {
                #region Static

                public static void NAR(object o)
                {
                try
                {
                Marshal.ReleaseComObject(o);
                }
                catch { }
                finally
                {
                o = null;
                }
                }

                #endregion
                }
                [/highlight]

                Das ganze kann man dank IDisposable dann schön in eine Using Anweisung packen. Hoffe das hilft
                Zuletzt editiert von fanderlf; 03.12.2009, 12:39.

                Comment


                • #9
                  Ich hab das bei mir ebenfalls ähnlich umgesetzt. Die Sub Nar reicht bei mir aber nicht aus.
                  Ich habe jetzt direkt nach dem erstellen der Excelinstanz die ProcId festgestellt und wenn ich fertig bin kille ich diese.
                  Das ist zwar nicht so ganz sauber. Funktioniert aber....

                  Comment


                  • #10
                    Naja... solange das Dokument gespeichert ist, sollte es ja eigentlich egal sein.

                    Aber diese Interop Geschichte stinkt echt zum Himmel -.-

                    Comment

                    Working...
                    X