ValueTask vs Task: Doğru Seçimi Yapmak
Task ve ValueTask, C# asenkron programlamada sıkça karşılaşılan iki yapı. Aralarındaki fark sadece isim değil; performans ve kullanım senaryoları tamamen farklı.
Task,.NET'in temel asenkron yapısıdır. Heap üzerinde tahsis edilen bir referans tipidir. İşin başında ve sonunda her zaman bellek ayırma maliyeti vardır. Uzun süren işlemler, ağ istekleri veya veritabanı sorguları için idealdir çünkü bu durumda bellek overhead'i önemsizdir.
ValueTask,.NET 4.5+ ile gelmiş bir değer tipidir (struct). Stack üzerinde tahsis edilir, bellek ayırma maliyeti çok düşüktür. Özellikle sık çağrılan, çoğunlukla hızlı tamamlanan işlemler için tasarlanmıştır.
Aşağıda her ikisini de kullanan örnek kod var:
1using System;2using System.Diagnostics;3using System.Threading.Tasks;45class Program6{7// Task kullanan metod8static async Task<int> GetDataWithTask()9{10await Task.Delay(10);11return 42;12}1314// ValueTask kullanan metod15static async ValueTask<int> GetDataWithValueTask()16{17await Task.Delay(10);18return 42;19}2021// Hızlı işlem: ValueTask avantajı gösterir22static ValueTask<int> FastOperation(int x)23{24if (x > 0)25return new ValueTask<int>(x * 2); // Senkron sonuç26return new ValueTask<int>(SlowAsync(x));27}2829static async Task<int> SlowAsync(int x)30{31await Task.Delay(5);32return x * 2;33}3435static async Task Main()36{37// Task çağrısı38var result1 = await GetDataWithTask();39Console.WriteLine($"Task sonuç: {result1}");4041// ValueTask çağrısı42var result2 = await GetDataWithValueTask();43Console.WriteLine($"ValueTask sonuç: {result2}");4445// Hızlı işlem (ValueTask burada bellek tahsis etmez)46var result3 = await FastOperation(10);47Console.WriteLine($"Hızlı işlem: {result3}");48}49}Beklenen Çıktı:
1Task sonuç: 422ValueTask sonuç: 423Hızlı işlem: 20Task kullan:
- API tasarımında (public metod)
- Uzun süren işlemler (ağ, dosya, veritabanı)
- Sonuç çoğunlukla asenkron olacaksa
ValueTask kullan:
- Çok sık çağrılan metotlar
- Sonuç genelde senkron (cache, basit hesaplama)
- Bellek baskısı yüksek sistemler
- Ancak internal/private metodlarda
ValueTask'ın bir uyarısı: await etmeden birden fazla kez çağırma veya Task'a dönüştürme gibi işlemler sorun yaratabilir. Task daha güvenli ve tahmin edilebilirdir.
0 yorum