۱۴۰۴/۰۷/۰۹ Nebular

async/await و Task در C#

۱. Async + Await

۱.۱ تعریف

  • async → علامت‌گذاری یک متد به عنوان غیرهمزمان.
  • await → انتظار برای نتیجه یک Task بدون بلوکه کردن thread فعلی.

نکته: وقتی متد async تعریف می‌شود، معمولاً نوع بازگشتی آن Task یا Task<T> است.


۱.۲ مثال ساده

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        Console.WriteLine("Start");
        await DoWorkAsync();
        Console.WriteLine("End");
    }

    static async Task DoWorkAsync()
    {
        await Task.Delay(2000); // شبیه‌سازی کار غیرهمزمان
        Console.WriteLine("Work done");
    }
}

خروجی:

Start
Work done  (بعد از 2 ثانیه)
End

توضیح:

  • Task.Delay(2000) عملیات را به صورت غیرهمزمان اجرا می‌کند.
  • thread اصلی بلوکه نمی‌شود، بلکه پس از اتمام Task، ادامه متد اجرا می‌شود.

۱.۳ نکته مهم:

  • سازنده نمی‌تواند async باشد.
    • نمی‌توان نوشت: public async MyClass() { }
    • اگر نیاز به عملیات async در سازنده باشد، از factory async استفاده می‌کنیم:
class MyClass
{
    private MyClass() { }

    public static async Task<MyClass> CreateAsync()
    {
        var obj = new MyClass();
        await Task.Delay(1000); // عملیات async
        return obj;
    }
}

۲. Task.Run

۲.۱ تعریف

  • Task.Run یک کار را به ThreadPool می‌سپارد تا در پس‌زمینه اجرا شود.
  • توجه: همیشه thread جدید ایجاد نمی‌کند، بلکه از threadهای موجود در ThreadPool استفاده می‌کند.

مثال:

Task t = Task.Run(() =>
{
    for(int i = 0; i < 5; i++)
    {
        Console.WriteLine($"Running {i}");
        Task.Delay(500).Wait();
    }
});
t.Wait(); // منتظر می‌مانیم تا کار تمام شود

نکته: Task.Run بیشتر برای اجرای کار CPU-bound در پس‌زمینه کاربرد دارد.


۳. جمع‌بندی نکات مهم آزمونی

نکتهتوضیح
asyncعلامت‌گذاری متد غیرهمزمان
awaitانتظار برای Task بدون بلوکه کردن thread
نوع بازگشتیTask یا Task<T>
سازنده asyncمجاز نیست، باید از factory async استفاده شود
Task.Runکار را روی ThreadPool اجرا می‌کند، همیشه thread جدید نیست
کاربردasync/await برای I/O-bound، Task.Run برای CPU-bound
Accept Cookies
Accept Cookies
[your-shortcode]