۱۴۰۴/۰۷/۰۹
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
[your-shortcode]