.Net Core 3+ IAsyncDisposable

Erkan Güzelküçük
Devbase
Published in
2 min readJun 30, 2020

Her .Net geliştiricisi er yada geç Disposable() metodunu kullanır. Using’de dolaylı olarak bu metodu kullanmak diyebiliriz. Büyük çaplı projelerde bellek yönetimi performans açısından oldukça önemlidir.Günümüzde sistemlerin RAM kapasiteleri yüksek olsa da yükselen kullanıcı sayısı açısından sunucular göz önüne alındığında bellek yönetimi sorunları kaçınılmaz olmaktadır.

Bu fotoğraf Artem Labunsky tarafından çekilmiştir.

IDisposable, bellek yönetimi yapmak için kullanılan bir Interface’dir. .Net Framework 1.1 sürümünden bu yana zaten var olan bir Interface’dir.

Tabii ki o zamanlardan bu zamanlara bir çok şey değişti. Async/Await kavramları hayatımıza girdi. Dolayısıyla asenkron işlemlerde Dispose ihtiyacı var demektir.

await Task.Run(() => disposableObj.Dispose());

Tabii ki bu şekilde bir işlem yapılabilir. Fakat önermek çok doğru olmayacaktır. Task.Run() yanlış kullanımı Thread Pool aşırı tüketimine yol açacaktır. Bu durum performansı etkileyen büyük bir faktör olarak karşınıza çıkabilir. Bunun için size yeni Interface IAsyncDisposable yardımcı olacaktır. IAsyncDisposable .Net Core 3.0 sürümü ile gelen bir Interface’dir. .Net Standart 2.1 sürümünde de kullanılabilmektedir.

IAsyncDisposable’ı .Net Core 2.1 sürümünde kullanmak istediğinizde aşağıdaki gibi bir hata mesajı ile karşılaşacaksınız.

error CS0246: The type or namespace name IAsyncDisposable could not be found (are you missing a using directive or an assembly reference?)

.Net Standart 2.0 sürümünde denediğinizde de aynı hatayı alacaksınız. Bu işlemi .Net Core 3.0 sürümünden önce Microsoft.Bcl.AsyncInterfaces (compatibility bridge) CoreFx ekibi tarafından yayınlanmıştı ve bu paketi kullanarak yapabilmekteydik. Fakat CoreFX ekibi paketi artık geliştirmiyor ve Github CoreFx kaynağından kaldırdılar.

.Net Core 3.0 sürümünde ufak bir örnek yaparak IAsyncDisposable Interface’i deneyelim.

Asenkron Dispose işlemini görebilmek için arada bir geciktirme(Delay) işlemi yapıldı. IAsyncDisposable.DisposeAsync() metodu IDisposable Interface’in Dispose() metodu ile aynı işlevi yerine getirir. Bu kod’u çalıştırdığımızda çıktısı şu şekilde olacaktır.

Merhaba!
Ertele!
Yok Et!
Tamamlandı!

--

--

Erkan Güzelküçük
Devbase

Software Architecture and Research Applications Development Team Leader at Koç University