TGViewer
C# Geeks (.NET) C# Geeks (.NET) @csharpgeeks · 550 subscribers
Post #536 298
تفاوت 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.”
More from @csharpgeeks
  1. Sep 22, 2026یه مدتی قراره از دنیای NET. فاصله بگیرم، چون وقتشه برم سربازی. راستش نمیدونم این مدت رو چج…
  2. Sep 20, 2026🔥 حالا مشکل اصلی: Alert Storm فرض کن Database از دسترس خارج شده. ۱۰۰ Pod داری. هر Pod می‌…
  3. Sep 20, 2026🚨 طراحی سیستم Monitoring و Alerting در یک سیستم بزرگ فرض کن ساعت ۳ صبح است. سیستم شما با…
  4. Sep 19, 2026#Engineering_Leadership تصمیم نگرفتن هم یک تصمیم است یه چیز عجیب توی تیم‌های مهندسی: گاهی…
  5. Sep 19, 2026☑ چک‌لیست آماده‌سازی تیم، فرایندها و زیرساخت برای توسعه با AI توجه: هیچ چک‌لیستی جهان‌شمول…
  6. Sep 19, 2026📌پایان یک انتظار طولانی: اعتبارسنجی ناهمگام (Async Validation) در NET 11.
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →