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


Очистка неуправляемых ресурсов

Для большинства создаваемых приложеним объектов можно использовать сборщик мусора .NET для обработки управления памятью. Однако при создании объектов, включающих неуправляемые ресурсы, необходимо явно освободить эти ресурсы после их завершения. Основным типом неуправляемых ресурсов являются объекты, заключающие ресурсы операционной системы, такие как файлы, окна, сетевые подключения и подключения к базам данным. Хотя сборщик мусора может отслеживать время жизни управляемого объекта, инкапсулирующего неуправляемые ресурсы, он не имеет сведений о том, как освобождать такие ресурсы.

Если ваши типы используют неуправляемые ресурсы, необходимо выполнить следующие действия:

  • Реализуйте шаблон удаления. Для этого требуется предоставить реализацию IDisposable.Dispose для детерминированного освобождения неуправляемых ресурсов. Объект-получатель типа вызывает метод Dispose, когда объект и используемые им ресурсы больше не нужны. Метод Dispose немедленно освобождает неуправляемые ресурсы.

  • Предусмотрите способ освобождения неуправляемых ресурсов, если метод Dispose не будет вызван объектом-получателем. Это можно сделать двумя способами.

    • Используйте безопасный дескриптор в качестве оболочки для неуправляемого ресурса. Рекомендуем использовать этот метод. Безопасные дескрипторы являются производными от абстрактного класса System.Runtime.InteropServices.SafeHandle. Они включают надежный метод Finalize. При использовании безопасного дескриптора нужно просто реализовать интерфейс IDisposable и вызвать метод Dispose этого безопасного дескриптора в реализации IDisposable.Dispose. Метод завершения безопасного дескриптора автоматически вызывается сборщиком мусора, если не вызывается метод Dispose.

      или

    • Определите метод завершения. Завершение включает недетерминированное освобождение неуправляемых ресурсов, когда объекту-получателю типа не удается вызвать метод IDisposable.Dispose для их детерминированного удаления.

      Предупреждение

      Завершение объектов может быть сложной и подверженной ошибкам операции, рекомендуется использовать безопасный дескриптор вместо предоставления собственного средства завершения.

Объекты-получатели типа могут затем вызвать реализацию IDisposable.Dispose непосредственно для освобождения памяти, используемой неуправляемыми ресурсами. При правильной реализации метода Dispose метод Finalize или переопределенная версия метода Object.Finalize становятся резервным средством очистки ресурсов в случае, если не вызывается метод Dispose.

В этом разделе

Реализация метода Dispose — описание того, как реализовать шаблон удаления для освобождения неуправляемых ресурсов.

Использование объектов, реализующихIDisposable — описание того, как объекты-получатели типа обеспечивают вызов своей реализации метода Dispose. Для этого настоятельно рекомендуется использовать инструкцию C# using (или Visual Basic Using).

Справочные материалы

Тип или член Description
System.IDisposable Определяет метод Dispose для освобождения неуправляемых ресурсов.
Object.Finalize Предусматривает завершение объекта, если неуправляемые ресурсы не освобождены методом Dispose.
GC.SuppressFinalize Отключает завершение. Этот метод обычно вызывается из метода Dispose, чтобы не допустить выполнения метода завершения.