Was ist der Unterschied zwischen Verwenden und Warten? Und wie kann ich entscheiden, welches ich verwenden soll?


21

Ich habe festgestellt, dass Visual Studio dies in einigen Fällen empfiehlt

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

an Stelle von

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

Was ist der Unterschied zwischen usingund await using?

Wie soll ich mich für eine entscheiden?


3
Es sieht so aus, als könnten Sie nur await usingmit a IAsyncDisposableund nur usingmit a verwenden, IDisposableda keiner von beiden vom anderen erbt. Sie können beide nur verwenden, wenn die konkrete Klasse beide implementiert, und dann hängt es davon ab, ob Sie asynchronen Code schreiben oder nicht.
Juharr

Antworten:


31

Klassische Synchronisierung mit

Classic using ruft die Dispose()Methode eines Objekts auf, das die IDisposableSchnittstelle implementiert .

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

Ist äquivalent zu

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

Neue Async warten auf Verwendung

Die neuen warten mit Aufrufen und warten auf die DisposeAsync()Methode eines Objekts, das die IAsyncDisposableSchnittstelle implementiert .

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

Ist äquivalent zu

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

Die IAsyncDisposable-Schnittstelle wurde in .NET Core 3.0und hinzugefügt .NET Standard 2.1.

In .NET implementieren Klassen, die nicht verwaltete Ressourcen besitzen, normalerweise die IDisposable- Schnittstelle, um einen Mechanismus zum synchronen Freigeben nicht verwalteter Ressourcen bereitzustellen. In einigen Fällen müssen sie jedoch zusätzlich (oder anstelle) der synchronen einen asynchronen Mechanismus zum Freigeben nicht verwalteter Ressourcen bereitstellen . Durch die Bereitstellung eines solchen Mechanismus kann der Verbraucher ressourcenintensive Entsorgungsvorgänge ausführen, ohne den Hauptthread einer GUI-Anwendung für lange Zeit zu blockieren.

Die IAsyncDisposable.DisposeAsync- Methode dieser Schnittstelle gibt eine ValueTask zurück , die die asynchrone Entsorgungsoperation darstellt. Klassen, die nicht verwaltete Ressourcen besitzen, implementieren diese Methode, und der Benutzer dieser Klassen ruft diese Methode für ein Objekt auf, wenn sie nicht mehr benötigt wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.