Udostępnij za pośrednictwem


CriticalFinalizerObject Klasa

Definicja

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

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

Przykłady

Poniższy przykład kodu przedstawia użycie klasy w celu zapewnienia krytycznej SafeFileHandle finalizacji 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 kodu w finalizatorze do wywołania kodu tylko z silnym kontraktem niezawodności. Aby uzyskać więcej informacji o programach 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 przymusowo zwalnia domenę aplikacji lub przerywa wątku. Jeśli finalizator narusza reguły cer, może nie zostać wykonane pomyślnie. Ponadto CLR ustanawia słabe 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 klasie pochodzącej SafeHandle 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 .NET Framework udostępnia dwie klasy i SafeHandle CriticalHandle, które zapewniają krytyczne funkcje finalizacji dla obsługi zasobów. Ponadto .NET Framework udostępnia zestaw wstępnie napisanych klas pochodnych od SafeHandle klasy, a ten zestaw znajduje się w Microsoft.Win32.SafeHandles przestrzeni nazw. Te klasy zostały zaprojektowane tak, aby zapewnić typowe funkcje obsługi dojść do plików i systemów operacyjnych.

Konstruktory

CriticalFinalizerObject()

Inicjuje nowe wystąpienie klasy CriticalFinalizerObject.

Metody

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()

Type Pobiera wartość bieżącego wystąpienia.

(Odziedziczone po Object)
MemberwiseClone()

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

(Odziedziczone po Object)
ToString()

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

(Odziedziczone po Object)

Dotyczy

Zobacz też