Task در مقابل Thread
هر دو برای اجرای همزمان کد به کار میروند، اما در سطح انتزاع و مدیریت منابع کاملاً متفاوتاند.
| ویژگی | Task | Thread |
|---|---|---|
| مدیریتشده توسط | 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 خام تقریباً همیشه برای سناریوهای خیلی خاص سیستمی رزرو میشود.
