Apa perbedaan antara menggunakan dan menunggu menggunakan? Dan bagaimana saya bisa memutuskan mana yang akan digunakan?

21

Saya perhatikan bahwa dalam beberapa kasus, Visual Studio merekomendasikan untuk melakukan ini

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

bukannya ini

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

Apa perbedaan antara usingdan await using?

Bagaimana saya harus memutuskan yang mana yang akan digunakan?

Justin Lessard
sumber
3
Sepertinya Anda hanya dapat menggunakan await usingdengan IAsyncDisposabledan Anda hanya dapat menggunakan usingdengan IDisposablekarena tidak ada yang mewarisi dari yang lain. Satu-satunya waktu Anda dapat menggunakan salah satunya adalah jika kelas beton mengimplementasikan keduanya dan kemudian tergantung pada apakah Anda menulis kode asinkron atau tidak.
juharr

Jawaban:

31

Sinkronisasi klasik menggunakan

Klasik menggunakan panggilan Dispose()metode objek yang mengimplementasikan IDisposableantarmuka.

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

Setara dengan

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

Async baru menunggu untuk digunakan

Yang baru menunggu menggunakan panggilan dan menunggu DisposeAsync()metode objek yang mengimplementasikan IAsyncDisposableantarmuka.

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

Setara dengan

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

The IAsyncDisposable Antarmuka ditambahkan pada .NET Core 3.0dan .NET Standard 2.1.

Di .NET, kelas yang memiliki sumber daya yang tidak dikelola biasanya mengimplementasikan antarmuka IDisposable untuk menyediakan mekanisme untuk melepaskan sumber daya yang tidak dikelola secara serempak. Namun, dalam beberapa kasus mereka perlu menyediakan mekanisme asinkron untuk melepaskan sumber daya yang tidak dikelola selain (atau bukannya) yang sinkron . Menyediakan mekanisme semacam itu memungkinkan konsumen untuk melakukan operasi pembuangan sumber daya intensif tanpa memblokir utas aplikasi GUI untuk waktu yang lama.

The IAsyncDisposable.DisposeAsync metode interface ini mengembalikan ValueTask yang mewakili operasi buang asynchronous. Kelas yang memiliki sumber daya yang tidak dikelola menerapkan metode ini, dan konsumen kelas-kelas ini memanggil metode ini pada objek ketika tidak lagi diperlukan.

Justin Lessard
sumber