CodeShot

Task در مقابل Thread

هر دو برای اجرای هم‌زمان کد به کار می‌روند، اما در سطح انتزاع و مدیریت منابع کاملاً متفاوت‌اند.

ویژگیTaskThread
مدیریت‌شده توسطThread Pool (.NET Runtime)سیستم‌عامل
سربار ایجادبسیار کمنسبتاً زیاد
پشتیبانی از async/awaitبله (ذاتی)خیر (نیاز به هماهنگی دستی)
قابلیت لغو (Cancellation)بله — CancellationTokenباید دستی پیاده‌سازی شود
بازگشت مقدار/استثنابله — Task<T> و Exception Propagationخیر — باید دستی منتقل شود
مناسب برایI/O-bound و اکثر سناریوهای برنامه‌نویسی امروزیکنترل کامل و مستقیم سطح سیستم‌عامل

کِی از Task استفاده کنیم؟

وقتی می‌خواهید کاری را به‌صورت ناهمگام (async) اجرا کنید، از نتیجه یا استثنای آن مطلع شوید، یا چند کار را با Task.WhenAll ترکیب کنید.

کِی از Thread استفاده کنیم؟

وقتی به کنترل کامل و مستقیم روی یک نخ اجرای مستقل نیاز دارید — مثلاً برای یک عملیات پس‌زمینه بلندمدت و مجزا با اولویت خاص سیستم‌عامل.

مثال Task

var result = await Task.Run(() => ComputeHeavyWork());

مثال Thread

var thread = new Thread(() => ComputeHeavyWork());
thread.Start();
thread.Join();

اشتباه رایج

ساختن یک Thread جدید برای هر درخواست HTTP در ASP.NET Core — این کار Thread Pool داخلی فریم‌ورک را دور می‌زند و عملکرد را به‌شدت افت می‌دهد؛ به‌جایش از Task/async-await استفاده کنید.

جمع‌بندی

در اکثر برنامه‌های امروزی (به‌خصوص ASP.NET Core) باید از Task استفاده کرد؛ Thread خام تقریباً همیشه برای سناریوهای خیلی خاص سیستمی رزرو می‌شود.