تكرار السؤال: …
الإجابة المختصرة
لأن الكوروتين لا يمكن إيقافها قسرًا من الخارج؛ بل يجب أن يتحقق الكود دوريًا من حالة الإلغاء (isActive) أو يستدعي دوال تعليق قياسية تفحص الإلغاء.
الشرح
عند استدعاء job.cancel()، تتحول حالة الكوروتين إلى إيقاف، وتطلق دوال التعليق القياسية في المكتبة (مثل delay و yield) استثناء CancellationException. إذا كان الكود يحتوي على حلقة تكرار حسابية مكثفة (CPU Loop) دون استدعاء دوال تعليق، فلن يتوقف الكوروتين ما لم تفحص يدوياً شرط isActive أو تستدعي ensureActive().
مثال بالكود
val job = scope.launch(Dispatchers.Default) {
var i = 0
while (isActive) { // فحص التعاون مع الإلغاء
doCpuHeavyWork(i++)
}
}
job.cancel() // سيستجيب الكوروتين في الدورة القادمة ويتوقفأخطاء شائعة
- التقاط Exception بشكل عام (catch (e: Exception)) دون إعادة رمي CancellationException، مما يبتلع إشارة الإلغاء ويمنع الكوروتين من التوقف.