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). Для этого требуется код в методе завершения для вызова только кода с строгим контрактом надежности. Дополнительные сведения о ЦС см. в System.Runtime.ConstrainedExecution пространстве имен.

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

В большинстве случаев не нужно писать классы, производные от 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)

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

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