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


Интерфейс System.IAsyncDisposable

В этой статье приводятся дополнительные замечания к справочной документации по этому API.

В .NET классы, владеющие неуправляемыми ресурсами, обычно реализуют интерфейс IDisposable, чтобы обеспечить механизм синхронного освобождения неуправляемых ресурсов. Однако в некоторых случаях им необходимо предоставить асинхронный механизм для освобождения неуправляемых ресурсов в дополнение к синхронному (или вместо него). Предоставление такого механизма позволяет пользователю выполнять ресурсоемкие операции освобождения ресурсов без блокировки основного потока приложения графического интерфейса на продолжительное время.

Метод IAsyncDisposable.DisposeAsync этого интерфейса возвращает ValueTask, которая представляет асинхронную операцию удаления. Классы, принадлежащие неуправляемым ресурсам, реализуют этот метод, и потребитель этих классов вызывает этот метод для объекта, если он больше не нужен.

Асинхронные методы используются в сочетании с asyncawait ключевыми словами в C# и Visual Basic. Дополнительные сведения см. в статье "Схема асинхронного программирования Task в C#" или "Асинхронное программирование с помощью Async и Await (Visual Basic)".

Использование объекта, реализующего IAsyncDisposable

Если ваше приложение использует объект, реализующий IAsyncDisposable, следует вызвать DisposeAsync этого объекта после завершения его использования. Чтобы убедиться, что ресурсы выпускаются даже в случае исключения, поместите код, который использует IAsyncDisposable объект в инструкцию using (в C# начиная с версии 8.0) или вызовите DisposeAsync метод внутри finally предложения инструкции try/finally . Дополнительные сведения о шаблоне try/finally см. try-finally (C#) или Try...Catch...Finally (Visual Basic).

Реализуйте IAsyncDisposable

Вы можете реализовать IAsyncDisposable в следующих ситуациях:

  • При разработке асинхронного перечислителя, которому принадлежат неуправляемые ресурсы. Асинхронные перечислители используются с функцией асинхронных потоков C# 8.0. Дополнительные сведения об асинхронных потоках см. в руководстве. Создание и использование асинхронных потоков с помощью C# 8.0 и .NET Core 3.0.
  • Если ваш класс имеет неуправляемые ресурсы, освобождение которых требует ресурсоемкой операции ввода-вывода, такой как очистка содержимого промежуточного буфера в файл или отправка пакета через сеть для закрытия подключения.

Используйте метод DisposeAsync для выполнения любой очистки, необходимой после использования неуправляемых ресурсов, таких как освобождение, удаление или сброс этих ресурсов. Дополнительные сведения см. в разделе "Реализация метода DisposeAsync".