CodeShot
Async/Await1 دقیقه مطالعه

Async/Await در C# چیست؟

مکانیزمی که اجازه می‌دهد عملیات I/O بدون بلاک کردن Thread و به‌صورت غیرهمزمان اجرا شوند تا برنامه سریع‌تر و پاسخگوتر بماند.

چرا مهم است؟

async/await باعث افزایش Throughput در ASP.NET Core و Responsiveness در UI می‌شود، بدون آنکه کدنویسی همزمانی پیچیده لازم باشد.

Async/Await چیست؟

مکانیزمی که با اجرای غیرهمزمان (Asynchronous) عملیات I/O، باعث افزایش مقیاس‌پذیری (Scalability) و پاسخگویی (Responsiveness) برنامه می‌شود — بدون بلاک کردن Thread.

کاربردها

فراخوانی API · خواندن/نوشتن فایل · دسترسی به Database · ارسال ایمیل · هر عملیات I/O طولانی

نکته: برای عملیات CPU-Bound معمولاً از async/await به‌تنهایی استفاده نمی‌شود؛ Task.Run() مناسب‌تر است.

کلمات کلیدی

public async Task<string> GetDataAsync()
{
    var result = await httpClient.GetStringAsync(url);
    return result;
}
  • async به یک متد اجازه می‌دهد از await استفاده کند.
  • await تا پایان Task منتظر می‌ماند، اما Thread را بلاک نمی‌کند.

نوع بازگشتی‌های Async

نوع کاربرد
Task بدون مقدار بازگشتی
Task<T> همراه با مقدار بازگشتی
ValueTask<T> برای بهینه‌سازی در سناریوهای خاص
async void فقط برای Event Handler (استفاده محدود)

بهترین روش‌ها

  • همیشه Task/Task<T> را برگردانید، نه async void.
  • از async تا انتهای زنجیره استفاده کنید (Async All the Way).
  • از متدهای Async کتابخانه‌ها استفاده کنید (ReadAsync، SaveChangesAsync و ...).
  • برای عملیات قابل لغو از CancellationToken استفاده کنید.

اشتباهات رایج

❌ استفاده از .Result یا .Wait() (احتمال Deadlock) · ❌ استفاده زیاد از async void · ❌ فراموش کردن await · ❌ اجرای عملیات CPU-Heavy با Async

نکته کلیدی: Async بدون Await تقریباً بی‌فایده است؛ await هرگز Thread را Block نمی‌کند؛ Task برای I/O و Task.Run برای CPU-Bound است.

خلاصه

  • async/await عملیات I/O را بدون بلاک کردن Thread اجرا می‌کند.
  • await منتظر پایان Task می‌ماند اما Thread را آزاد نگه می‌دارد.
  • برای CPU-Bound از Task.Run، برای I/O از async/await استفاده کنید.

حالا امتحان کن

🧩آزمون Async/Await در C#6 سؤال · نمره قبولی 60٪
این مطلب مفید بود؟
نشان کردن
مشاهده در Concept Hub ←