SafeHandle.ReleaseHandle Methode

Definition

Führt beim Überschreiben in einer abgeleiteten Klasse den Code aus, der für das Freigeben des Handles erforderlich ist.

protected:
 abstract bool ReleaseHandle();
protected abstract bool ReleaseHandle ();
abstract member ReleaseHandle : unit -> bool
Protected MustOverride Function ReleaseHandle () As Boolean

Gibt zurück

Boolean

true, wenn das Handle erfolgreich freigegeben wurde, andernfalls im Fall eines schwerwiegenden Fehlers false. In diesem Fall wird ein releaseHandleFailed-Assistent für verwaltetes Debuggen (Managed Debugging Assistant, MDA) generiert.

Beispiele

Im folgenden Codebeispiel wird der Handle freigegeben und ist Teil eines größeren Beispiels, das für die SafeHandle Klasse bereitgestellt wird.

[ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
override protected bool ReleaseHandle()
{
    // Here, we must obey all rules for constrained execution regions.
    return NativeMethods.CloseHandle(handle);
    // If ReleaseHandle failed, it can be reported via the
    // "releaseHandleFailed" managed debugging assistant (MDA).  This
    // MDA is disabled by default, but can be enabled in a debugger
    // or during testing to diagnose handle corruption problems.
    // We do not throw an exception because most code could not recover
    // from the problem.
}

Hinweise

Die ReleaseHandle Methode wird garantiert nur einmal aufgerufen und nur, wenn der Handle als definiert durch die IsInvalid Eigenschaft gültig ist. Implementieren Sie diese Methode in Ihren SafeHandle abgeleiteten Klassen, um jeden Code auszuführen, der zum Freigeben des Handles erforderlich ist. Da eine der Funktionen SafeHandle die Verhinderung von Ressourcenlecks garantiert, muss der Code in Ihrer Implementierung ReleaseHandle nie fehlschlagen. Der Garbage Collector ruft ReleaseHandle nach normalen Finalizern für Objekte ab, die gleichzeitig gesammelt wurden. Der Garbage Collector garantiert, dass die Ressourcen zum Aufrufen dieser Methode verwendet werden und dass die Methode während der Ausführung nicht unterbrochen wird. Diese Methode wird als eingeschränkter Ausführungsbereich (CER) zur Instanzbauzeit vorbereitet (zusammen mit allen Methoden in seinem statisch determinierbaren Aufrufdiagramm). Obwohl dies verhindert, dass Threadabbrüche unterbrochen werden, müssen Sie weiterhin vorsichtig sein, keine Fehlerpfade in Ihrer überschriebenen ReleaseHandle Methode einzuführen. Wenden Sie insbesondere das Attribut auf alle Methoden an, die ReliabilityContractAttribute Sie aufrufen ReleaseHandle. In den meisten Fällen sollte dieser Code folgendes sein:

ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)

Darüber hinaus können Sie für einfache Bereinigungen (z. B. das Aufrufen der Windows-API CloseHandle auf einem Dateihandpunkt) den Rückgabewert für den Aufruf der einzelnen Plattform überprüfen. Bei komplexen Bereinigungen haben Sie möglicherweise viele Programmlogik und viele Methodenaufrufe, von denen einige fehlschlagen können. Sie müssen sicherstellen, dass Ihre Programmlogik Für jede dieser Fälle Fallbackcode aufweist.

Wenn ReleaseHandle sie aus irgendeinem Grund zurückgegeben false wird, generiert sie einen ReleaseHandleFailed Managed Debug Assistant. Dadurch können Sie Fälle erkennen, in denen Ihr Versuch, Ressourcen zu freigeben, fehlschlägt.

Gilt für

Siehe auch