Поделиться через


CriticalFinalizerObject Класс

Определение

Гарантирует, что весь код завершения в производных классах помечен как критический.

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
Наследование
CriticalFinalizerObject
Производный
Атрибуты

Примеры

В следующем примере кода показано использование класса для обеспечения критического SafeFileHandle завершения для стандартных входных и выходных потоков. Объект SafeFileHandle, производный SafeHandle от класса , передается в файловый поток в конструкторе 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

Комментарии

Классы, производные от класса , CriticalFinalizerObject неявно рассматриваются как ограниченная область выполнения (CER). Для этого требуется, чтобы код в методе завершения вызывал только код со строгим контрактом надежности. Дополнительные сведения о cer см. в System.Runtime.ConstrainedExecution разделе Пространство имен.

В классах, производных от CriticalFinalizerObject класса , среда CLR гарантирует, что всем критически важным кодам завершения будет предоставлена возможность выполнения при условии, что метод завершения следует правилам для CER, даже в ситуациях, когда среда CLR принудительно выгружает домен приложения или прерывает поток. Если метод завершения нарушает правила для CER, он может не выполниться. Кроме того, среда CLR устанавливает слабый порядок среди обычных и критически важных методов завершения: для объектов, освобождаемых одновременно сборкой мусора, все некритические методы завершения вызываются перед любым из критических методов завершения. Например, класс, например FileStream, который содержит данные в SafeHandle классе, производном от CriticalFinalizerObject, может запустить стандартный метод завершения для очистки существующих буферированных данных.

В большинстве случаев не требуется писать классы, производные CriticalFinalizerObject от класса . Библиотека классов платформа .NET Framework предоставляет два класса, SafeHandle и CriticalHandle, которые предоставляют критически важные функции завершения для ресурсов дескриптора. Кроме того, платформа .NET Framework предоставляет набор предварительно созданных классов, производных от SafeHandle класса , и этот набор находится в Microsoft.Win32.SafeHandles пространстве имен. Эти классы предназначены для предоставления общих функций для поддержки дескрипторов файлов и операционной системы.

Конструкторы

CriticalFinalizerObject()

Инициализирует новый экземпляр класса CriticalFinalizerObject.

Методы

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
Finalize()

Освобождает все ресурсы, занятые классом CriticalFinalizerObject.

GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetType()

Возвращает объект Type для текущего экземпляра.

(Унаследовано от Object)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ToString()

Возвращает строку, представляющую текущий объект.

(Унаследовано от Object)

Применяется к

См. также раздел