CriticalFinalizerObject Klasa

Definicja

Gwarantuje, że cały kod finalizacji w klasach pochodnych jest oznaczony jako krytyczny.

public ref class CriticalFinalizerObject abstract
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class CriticalFinalizerObject
public abstract class CriticalFinalizerObject
[<System.Runtime.InteropServices.ComVisible(true)>]
type CriticalFinalizerObject = class
type CriticalFinalizerObject = class
Public MustInherit Class CriticalFinalizerObject
Dziedziczenie
CriticalFinalizerObject
Pochodne
Atrybuty

Przykłady

Poniższy przykład kodu przedstawia użycie SafeFileHandle klasy w celu zapewnienia krytycznej finalizacji dla standardowych strumieni wejściowych i wyjściowych. Element SafeFileHandle, pochodzący z SafeHandle klasy, jest przekazywany do strumienia plików w konstruktorze FileStream .

using System;
using System.Runtime.InteropServices;
using System.IO;
using Microsoft.Win32.SafeHandles;

namespace CriticalFinalizer
{
    class Program
    {
        const int STD_INPUT_HANDLE   = -10;
        const int STD_OUTPUT_HANDLE = -11;
        const int STD_ERROR_HANDLE  =  -12;
        [DllImport("Kernel32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        public static extern IntPtr GetStdHandle(int type);

        static void Main(string[] args)
        {
            FileStream fsIn = null;
            FileStream fsOut = null;
            try
            {
                SafeFileHandle sfhIn = new SafeFileHandle(GetStdHandle(STD_INPUT_HANDLE), false);
                fsIn = new FileStream(sfhIn, FileAccess.Read);
                byte[] input = new byte[] {0};
                fsIn.Read(input,0,1);
                SafeFileHandle sfhOut = new SafeFileHandle(GetStdHandle(STD_OUTPUT_HANDLE), false);
                fsOut = new FileStream(sfhOut, FileAccess.Write);
                fsOut.Write(input,0,1);
                SafeFileHandle sf = fsOut.SafeFileHandle;
            }
            finally
            {
                if (fsIn != null)
                {
                    fsIn.Close();
                    fsIn = null;
                }
                if (fsOut != null)
                {
                    fsOut.Close();
                    fsOut = null;
                }
            }
        }
    }
}
Imports System.Runtime.InteropServices
Imports System.IO
Imports Microsoft.Win32.SafeHandles

Public Module Example
   Const STD_INPUT_HANDLE As Integer  = -10
   Const STD_OUTPUT_HANDLE As Integer = -11
   Const STD_ERROR_HANDLE As Integer  = -12

   Public Declare Auto Function GetStdHandle Lib "Kernel32" (type As Integer) As IntPtr

   Public Sub Main()
      Dim fsIn As FileStream = Nothing
      Dim fsOut As FileStream = Nothing

      Try
         Dim sfhIn As New SafeFileHandle(GetStdHandle(STD_INPUT_HANDLE), False)
         fsIn = new FileStream(sfhIn, FileAccess.Read)
         Dim input() As Byte = { 0 }
         fsIn.Read(input, 0, 1)
         Dim sfhOut As New SafeFileHandle(GetStdHandle(STD_OUTPUT_HANDLE), False)
         fsOut = New FileStream(sfhOut, FileAccess.Write)
         fsOut.Write(input, 0, 1)
         Dim sf As SafeFileHandle = fsOut.SafeFileHandle
      Finally
         If fsIn IsNot Nothing Then
            fsIn.Close()
            fsIn = Nothing
         End If
         If fsOut IsNot Nothing Then 
            fsOut.Close()
            fsOut = Nothing
         End If
      End Try
   End Sub
End Module

Uwagi

Klasy pochodzące z CriticalFinalizerObject klasy są niejawnie traktowane jako ograniczony region wykonywania (CER). Wymaga to, aby kod w finalizatorze był wywoływany tylko przy użyciu silnego kontraktu niezawodności. Aby uzyskać więcej informacji na temat cers, zobacz System.Runtime.ConstrainedExecution przestrzeń nazw.

W klasach pochodzących z CriticalFinalizerObject klasy środowisko uruchomieniowe języka wspólnego (CLR) gwarantuje, że cały krytyczny kod finalizacji będzie miał możliwość wykonania, pod warunkiem, że finalizator jest zgodny z regułami cer, nawet w sytuacjach, gdy CLR wymusza zwolnienie domeny aplikacji lub przerywa wątku. Jeśli finalizator narusza reguły cer, może nie zostać pomyślnie wykonany. Ponadto CLR ustanawia słabą kolejność wśród normalnych i krytycznych finalizatorów: w przypadku obiektów odzyskanych przez odzyskiwanie pamięci w tym samym czasie wszystkie niekrytyczne finalizatory są wywoływane przed żadnym z krytycznych finalizatorów. Na przykład klasa, taka jak FileStream, która przechowuje dane w SafeHandle klasie pochodzącej z CriticalFinalizerObjectklasy , może uruchomić standardowy finalizator, aby opróżnić istniejące buforowane dane.

W większości przypadków nie trzeba pisać klas, które pochodzą z CriticalFinalizerObject klasy . biblioteka klas platformy .NET Framework udostępnia dwie klasy, SafeHandle i CriticalHandle, które zapewniają krytyczne funkcje finalizacji do obsługi zasobów. Ponadto .NET Framework udostępnia zestaw wstępnie napisanych klas pochodzących z klasy SafeHandle, a ten zestaw znajduje się w przestrzeni nazw Microsoft.Win32.SafeHandles. Te klasy zostały zaprojektowane w celu zapewnienia typowych funkcji obsługi dojść do plików i systemów operacyjnych.

Konstruktory

Nazwa Opis
CriticalFinalizerObject()

Inicjuje nowe wystąpienie klasy CriticalFinalizerObject.

Metody

Nazwa Opis
Equals(Object)

Określa, czy dany obiekt jest taki sam, jak bieżący obiekt.

(Odziedziczone po Object)
Finalize()

Zwalnia wszystkie zasoby używane przez klasę CriticalFinalizerObject .

GetHashCode()

Służy jako domyślna funkcja skrótu.

(Odziedziczone po Object)
GetType()

Pobiera Type bieżącego wystąpienia.

(Odziedziczone po Object)
MemberwiseClone()

Tworzy płytkią kopię bieżącego Object.

(Odziedziczone po Object)
ToString()

Zwraca ciąg reprezentujący bieżący obiekt.

(Odziedziczone po Object)

Dotyczy

Zobacz też