تفاوت Task و ValueTask چیه؟ 🤔⚡️
خیلیها فکر میکنن ValueTask فقط یک نسخه سبکتر از Task هست…
ولی داستان خیلی جالبتره!
بیاین با یک مثال واقعی درکش کنیم 👇
📌 ءTask چیه؟
🔹️ءTask یعنی:
«یک عملیات async که ممکنه هنوز انجام نشده باشه.»
در NET.، حتی اگر عملیات نتیجهای داشته باشه، یه Task جدید ساخته میشه.
این ساخت Task هزینه داره:
• یک Object جدید ساخته میشه
• ءGC باید بعداً جمعش کنه
• ءMemory Allocation رخ میده
در عملیات سبک و پرتکرار؟
این Allocations میتونه پرفورمنس رو زمین بزنه.
📌 ءValueTask چیه؟
ءValueTask اومده همین مشکل رو حل کنه!
🔸️ءValueTask یعنی:
«یک عملیات async که ممکنه نتیجه رو همین الان داشته باشه.»
اگر نتیجه آماده باشه، ValueTask هیچ object اضافهای ایجاد نمیکنه
• یعنی Zero Allocation
• یعنی سرعت بیشتر
• یعنی فشار کمتر روی GC
به همین دلیل یکی از سریعترین Primitiveهای داتنته.
💥 یک مثال واقعی
تصور کن یک Cache داری:
public Task<Item> GetItemAsync(string key)
{
if (_cache.TryGetValue(key, out var item))
return Task.FromResult(item); // Allocates
return FetchFromDbAsync(key);
}
در حالت بالا حتی برای cache hit هم یک Task جدید ساخته میشه!
ولی با ValueTask:
public ValueTask<Item> GetItemAsync(string key)
{
if (_cache.TryGetValue(key, out var item))
return new ValueTask<Item>(item); // No allocation
return new ValueTask<Item>(FetchFromDbAsync(key));
}
نتیجه؟
در حالت cache hit → هیچ Task اضافهای ساخته نمیشود.
⚠️ اما ValueTask همیشه بهتر نیست!
نکات مهم:
1️⃣ فقط یک بار میتونی awaitش کنی
چون value-type هست
اگر چند بار await کنی → Undefined Behavior
2️⃣ اگر عملیات همیشه async باشه ValueTask فقط پیچیدگی اضافه میکنه. Task مناسبتره.
3️⃣ ءchaining پیچیدهتره
ءConfigureAwait، ContinueWith و … روی ValueTask رفتارهای خاص دارند.
🎯 کی Task؟ کی ValueTask؟
🔸️ از Task استفاده کن وقتی:🔸️
عملیات همیشه async هست
مثل: query دیتابیس، ارسال ایمیل، فراخوانی API
نتیجه زود آماده نمیشود
سرویس ساده و خوانایی مهمتر از پرفورمنسه
🔸️ از ValueTask استفاده کن وقتی:🔸️
عملیات گاهی sync و گاهی async است
مانند: Cache, MemoryReader, CPU-bound operations
عملیات پرتکرار است و performance حیاتی است
میخواهی مخصــوصاً Allocation را صفر کنی
📝 جمعبندی
ءTask → همیشه async → همیشه object جدید → هزینه بیشتر
ءValueTask → async یا sync → گاهی بدون object → سریعتر
اما ValueTask ابزار پیشرفتهست.
نسبت به Task مسئولیت بیشتری روی دوش برنامهنویسه میذاره.
پیشنهاد مایکروسافت:
“Only use ValueTask when performance measurements justify it.”