تكرار السؤال: …
الإجابة المختصرة
تستقبل الرمز في معلمات المتحكم وتمرره تكرارياً لجميع دوال الـ async وقواعد البيانات، لإلغاء العمليات وتحرير الموارد فور إغلاق العميل للمتصفح.
الشرح
عندما يطلب مستخدم تقريراً يستغرق 30 ثانية ثم يغلق الصفحة بعد ثانيتين، فإن عدم تمرير CancellationToken يجعل الخادم يواصل استعلام قاعدة البيانات وحساب العمليات حتى النهاية دون فائدة. استقبال CancellationToken cancellationToken في الـ Action وتمريره لـ ToListAsync(cancellationToken) يوقف استعلام SQL في الخادم فور انقطاع اتصال العميل ويرمي OperationCanceledException محرراً الموارد فوراً.
مثال بالكود
[HttpGet("export")]
public async Task<IActionResult> Export(CancellationToken ct) {
var data = await db.Reports.ToListAsync(ct); // يتوقف فوراً إذا أغلق المستخدم المتصفح
return Ok(data);
}أخطاء شائعة
- ابتلاع OperationCanceledException في كتل catch عادية ومعاملتها كخطأ 500 غير متوقع للخادم.
أسئلة متابعة
- كيف تنفذ معالجة متوازية للمهام غير المتزامنة باستخدام Parallel.ForEachAsync في .NET 6+؟
- ما هي واجهة IAsyncEnumerable<T> وكيف تتيح تدفق نتائج البيانات الكبيرة في ASP.NET Core؟