Using ve await using arasındaki fark nedir? Hangisini kullanacağım konusunda nasıl karar verebilirim?


21

Bazı durumlarda Visual Studio'nun bunu önerdiğini fark ettim

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

bunun yerine

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

Arasındaki fark nedir usingve await using?

Hangisinin kullanılacağına nasıl karar vermeliyim?


3
Yalnızca kullanabilirsiniz gibi görünüyor await usingbir ile IAsyncDisposableve sadece kullanabilirsiniz usingbir ile IDisposablediğerinden ne biri INHERITS beri. Her ikisini de kullanabileceğiniz zaman somut sınıfın her ikisini de uygulayıp uygulama zaman uyumsuz kod yazıp yazmadığına bağlıdır.
juharr

Yanıtlar:


31

Kullanarak klasik senkronizasyon

Classic using Dispose(), IDisposablearabirimi uygulayan bir nesnenin yöntemini çağırır .

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

Eşittir

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

Yeni eşzamansız kullanım bekliyor

Yeni, çağrıları kullanmayı ve arabirimi DisposeAsync()uygulayan bir nesnenin yöntemini bekliyor IAsyncDisposable.

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

Eşittir

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

IAsyncDisposable Arayüz ilave edildi .NET Core 3.0ve .NET Standard 2.1.

.NET'te, yönetilmeyen kaynaklara sahip sınıflar genellikle yönetilmeyen kaynakları eşzamanlı olarak serbest bırakmak için bir mekanizma sağlamak üzere IDisposable arabirimini uygular . Bununla birlikte, bazı durumlarda , senkronize olana ek olarak (veya bunun yerine) yönetilmeyen kaynakları serbest bırakmak için asenkron bir mekanizma sağlamaları gerekir . Böyle bir mekanizma sağlanması, tüketicinin bir GUI uygulamasının ana iş parçacığını uzun süre engellemeden, kaynak yoğun imha işlemleri gerçekleştirmesini sağlar.

IAsyncDisposable.DisposeAsync bu arayüz yöntemi, döner ValueTask uyumsuz imha işlemi temsil eder. Yönetilmeyen kaynaklara sahip sınıflar bu yöntemi uygular ve bu sınıfların tüketicisi artık gerekli olmadığında bu yöntemi bir nesne üzerinde çağırır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.