Announcement

Collapse
No announcement yet.

Fehler bei Connection.Close()

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

  • Fehler bei Connection.Close()

    Hallo zusammen,
    beim schließen der Applikation prüfe ich ob die Connection noch offen ist, ist es der Fall, Schließe ich sie. Nicht immer, aber manchmal kommt es zu einer Fehlermeldung:
    „Laufzeitausnahme: System.InvalidOperationException - Der Handle wurde nicht initialisiert.“.

    Hier der Codeausschnitt:

    If Not (_Connection Is Nothing) Then
    If _Connection.State = ConnectionState.Open Then
    _Connection.Close()
    End If

    _Connection = Nothing
    End If

    Was mache ich falsch?

  • #2
    Hallo,
    das hört sich nach einer <i>Race Condition</i> an. Wann und wo wird der Codeausschnitt verwendet? Wie viele CPUs (physische oder logische) hat der Rechner?
    Auch wenn zwei Aufrufe direkt untereinander stehen, bedeutet dies nicht in jedem Fall, das in der 2. Zeile auch die If-Prüfung noch gilt. Wenn die Objektinstanz bereits früher freigegeben wurde, aber der GC den Speicher noch nicht abgeräumt hat, ist der Zugriff auf eine bereits "entwertete" Instanz noch möglich

    Comment


    • #3
      Hallo,
      der Rechner hat ein physisches CPU.
      Der Codeausschnitt wird in der DataBaseLauer Classe, die mit SqlConnection arbeitet, in der „Protected Overrides Sub Finalize()“ verwendet. Diese Prüfung steht hier in folgenden Abschnitt:

      Protected Overrides Sub Finalize()
      Try
      . . .
      Catch e As Exception
      . . .
      Finally
      If Not (_Connection Is Nothing) Then
      If _Connection.State = ConnectionState.Open Then _Connection.Close() ' Connection schliessen
      _Connection = Nothing
      End If
      End Try
      End Su

      Comment


      • #4
        Hallo,
        in <i>Finalize</i> hat dieser Aufruf auch nichts zu suchen, wenn nicht gleichzeitig <i>Dispose(False)</i> aufgerufen wird :-)

        Die SqlConnection-Klasse schließt die Verbindung automatisch, wenn die Instanz freigegeben wird. Wenn man im Programm "zur Vorsicht" selbst für einen definierten Zustand sorgen will, kann das Hauptformular das <i>FormClosing</i>Ereignis nutzen.

        Wenn es unbedingt in direkt in die Klasse soll, muss das <b>Dispose-Pattern</b> implementiert werden:

        <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Sub</span> Dispose() <span style="color: blue;">Implements</span> IDisposable.Dispose</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Debug.WriteLine(<span style="color: maroon;">"Dispose method"</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">' Ressourcen freigeben</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Dispose(<span style="color: blue;">True</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">' Finalize darf nicht mehr aufgerufen werden!</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; GC.SuppressFinalize(<span style="color: blue;">Me</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Protected</span> <span style="color: blue;">Overrides</span> <span style="color: blue;">Sub</span> Finalize()</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Debug.WriteLine(<span style="color: maroon;">"Finalize method"</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">' Ressourcen freigeben</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Dispose(<span style="color: blue;">False</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></p></div&gt

        Comment


        • #5
          Hallo,
          vielen Dank für die Hilfe.
          Ich hab es geändert und es funktioniert jetzt auch ganz gut

          Comment

          Working...
          X