Qual'è la differenza tra using e await using? E come posso decidere quale usare?


21

Ho notato che in alcuni casi Visual Studio consiglia di eseguire questa operazione

await using var disposable = new Disposable();
// Do something

Invece di questo

using var disposable = new Disposable();
// Do something

Qual è la differenza tra usinge await using?

Come dovrei decidere quale usare?


3
Sembra che puoi usare solo await usingcon a IAsyncDisposablee puoi usare solo usingcon a IDisposablepoiché nessuno dei due eredita dall'altro. L'unica volta che è possibile utilizzare è se la classe concreta implementa entrambi e quindi dipende dal fatto che si stia scrivendo o meno codice asincrono.
juharr

Risposte:


31

Sincronizzazione classica utilizzando

L'utilizzo classico chiama il Dispose()metodo di un oggetto che implementa l' IDisposableinterfaccia.

using var disposable = new Disposable();
// Do Something...

È equivalente a

IDisposable disposable = new Disposable();
try
{
    // Do Something...
}
finally
{
    disposable.Dispose();
}

Il nuovo asincrono ti aspetta usando

Il nuovo attende di utilizzare le chiamate e attende il DisposeAsync()metodo di un oggetto che implementa l' IAsyncDisposableinterfaccia.

await using var disposable = new AsyncDisposable();
// Do Something...

È equivalente a

IAsyncDisposable disposable = new AsyncDisposable();
try
{
    // Do Something...
}
finally
{
    await disposable.DisposeAsync();
}

L' interfaccia IAsyncDisposable è stata aggiunta in .NET Core 3.0e .NET Standard 2.1.

In .NET, le classi che possiedono risorse non gestite di solito implementano l' interfaccia IDisposable per fornire un meccanismo per rilasciare le risorse non gestite in modo sincrono. Tuttavia, in alcuni casi devono fornire un meccanismo asincrono per il rilascio di risorse non gestite oltre a (o anziché) quello sincrono . Fornire un tale meccanismo consente al consumatore di eseguire operazioni di smaltimento ad alta intensità di risorse senza bloccare a lungo il thread principale di un'applicazione GUI.

Il metodo IAsyncDisposable.DisposeAsync di questa interfaccia restituisce un oggetto ValueTask che rappresenta l'operazione di smaltimento asincrona. Le classi che possiedono risorse non gestite implementano questo metodo e il consumatore di queste classi chiama questo metodo su un oggetto quando non è più necessario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.