Sincronización clásica usando
El uso clásico llama al Dispose()
método de un objeto que implementa la IDisposable
interfaz.
using var disposable = new Disposable();
// Do Something...
Es equivalente a
IDisposable disposable = new Disposable();
try
{
// Do Something...
}
finally
{
disposable.Dispose();
}
Nueva asíncrona aguarda utilizando
El nuevo espera usando llamadas y espera el DisposeAsync()
método de un objeto que implementa la IAsyncDisposable
interfaz.
await using var disposable = new AsyncDisposable();
// Do Something...
Es equivalente a
IAsyncDisposable disposable = new AsyncDisposable();
try
{
// Do Something...
}
finally
{
await disposable.DisposeAsync();
}
La interfaz IAsyncDisposable se agregó en .NET Core 3.0
y .NET Standard 2.1
.
En .NET, las clases que poseen recursos no administrados generalmente implementan la interfaz IDisposable para proporcionar un mecanismo para liberar recursos no administrados sincrónicamente. Sin embargo, en algunos casos necesitan proporcionar un mecanismo asíncrono para liberar recursos no administrados además de (o en lugar de) el sincronizado . Proporcionar un mecanismo de este tipo permite al consumidor realizar operaciones de eliminación intensivas en recursos sin bloquear el hilo principal de una aplicación GUI durante mucho tiempo.
El método IAsyncDisposable.DisposeAsync de esta interfaz devuelve una ValueTask que representa la operación de eliminación asíncrona. Las clases que poseen recursos no administrados implementan este método, y el consumidor de estas clases llama a este método en un objeto cuando ya no es necesario.
await using
con aIAsyncDisposable
y solo se puede usarusing
con aIDisposable
ya que ninguno hereda del otro. El único momento que puede usar es si la clase concreta implementa ambos y luego depende de si está escribiendo código asincrónico o no.