Middle+
Zijn er gevallen waarin we coroutines niet kunnen annuleren?
sobes.tech AI
Antwoord van AI
Ja, ze bestaan.
Voorbeelden van dergelijke gevallen:
- De coroutine voert een lange rekenklus uit zonder regelmatige controle op annulering. De coroutine controleert
isActivealleen tijdens suspenderen (suspending). Als de taak niet wordt gepauzeerd (bijvoorbeeld een lange lus of wiskundige berekeningen), zal ze het annulering verzoek niet opmerken. - Het afhandelen van annulering uitzonderingen gebeurt niet (bijvoorbeeld,
CancellationExceptionwordt niet opgevangen). De coroutine kan eindigen, maar de bovenliggende coroutine of taakbeheerder weet niet dat deze is geannuleerd, en resources worden mogelijk niet correct vrijgegeven. - Gebruik van niet-coöperatieve dispatchers, zoals
Dispatchers.Unconfinedof een threadpool dispatcher die geen Coöperatieve Annulering ondersteunt. HoewelCancellationExceptionnog steeds wordt gegooid, kan het gedrag onvoorspelbaar zijn. - Gebruik van blokkerende invoer/output operaties zonder ze in suspenderende functies te wikkelen (bijvoorbeeld lezen uit
InputStreamin een lus zonderwithContext(Dispatchers.IO)en suspenderende methoden). Een blokkerende operatie controleert de coroutine status niet en gooit geenCancellationException.
Voor coöperatieve annulering moet de coroutine:
- Een dispatcher gebruiken die
Cooperative Cancellationondersteunt (bijvoorbeeld,Dispatchers.Default,Dispatchers.IO,Dispatchers.Main). - Regelmatig
isActivecontroleren of suspenderende functies gebruiken die dit voor haar doen. CancellationExceptioncorrect afhandelen.