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 استفاده کنید.
