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:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1using System;
2using System.Diagnostics;
3using System.Threading.Tasks;
4
5class Program
6{
7// Task kullanan metod
8static async Task<int> GetDataWithTask()
9{
10await Task.Delay(10);
11return 42;
12}
13
14// ValueTask kullanan metod
15static async ValueTask<int> GetDataWithValueTask()
16{
17await Task.Delay(10);
18return 42;
19}
20
21// Hızlı işlem: ValueTask avantajı gösterir
22static ValueTask<int> FastOperation(int x)
23{
24if (x > 0)
25return new ValueTask<int>(x * 2); // Senkron sonuç
26return new ValueTask<int>(SlowAsync(x));
27}
28
29static async Task<int> SlowAsync(int x)
30{
31await Task.Delay(5);
32return x * 2;
33}
34
35static async Task Main()
36{
37// Task çağrısı
38var result1 = await GetDataWithTask();
39Console.WriteLine($"Task sonuç: {result1}");
40
41// ValueTask çağrısı
42var result2 = await GetDataWithValueTask();
43Console.WriteLine($"ValueTask sonuç: {result2}");
44
45// 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ç: 42
2ValueTask sonuç: 42
3Hızlı işlem: 20

Task 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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz