اگر میخواهید احتمال Deadlock و مشکلات ناشی از Sync-over-Async را کاهش دهید:
1️⃣ از
.Result استفاده نکنیدغلط❌
var result = GetDataAsync().Result;
درست✅
var result = await GetDataAsync();
2️⃣ از .Wait() استفاده نکنید
غلط❌
GetDataAsync().Wait();
درست✅
csharp
await GetDataAsync();
3️⃣ ءAsync All the Way را رعایت کنید
اگر یک متد Async است:
Repository
↓
Service
↓
Handler
↓
Controller
اجازه دهید Task در تمام مسیر حرکت کند.
نه اینکه وسط مسیر ناگهان:
.Result
یا:
.Wait()
صدا زده شود.
4️⃣ در Libraryها به Context وابسته نشوید
اگر Library شما نیازی به Context اصلی ندارد، میتوانید در نقاط مناسب از:
.ConfigureAwait(false)
استفاده کنید.
5️⃣ از async void فقط برای Event Handler استفاده کنید
تقریباً در تمام Serviceها، Repositoryها، Handlerها و سایر متدهای Async:
Task
یا:
Task<T>
انتخاب مناسبتری است.
🎯 جمعبندی
ءDeadlock در دنیای Async معمولاً از خود async/await شروع نمیشود.
مشکل زمانی ایجاد میشود که:
یک عملیات Async را مجبور کنیم بهصورت Sync اجرا شود.
یعنی:
.Resultیا:
.Wait()در محیطی که Continuation نیاز دارد دوباره روی یک Context بلاکشده اجرا شود.
راهکار اصلی؟
🚀 Async All the Way
و در صورت نیاز:
🔧 ConfigureAwait(false)
و مهمتر از همه:
ءAsync code را Sync نکنید فقط چون صبر کردن با await برایتان راحتتر نیست.در ASP.NET Core شاید Deadlock کلاسیک SynchronizationContext را کمتر ببینید، اما Sync-over-Async همچنان میتواند Thread Pool را اشباع کند و سیستم شما را زیر Load به زانو دربیاورد.
🔖هشتگها:
#dotnet #csharp #async #await #deadlock #aspnetcore #threadpool