Sobes.tech
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 isActive alleen 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, CancellationException wordt 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.Unconfined of een threadpool dispatcher die geen Coöperatieve Annulering ondersteunt. Hoewel CancellationException nog steeds wordt gegooid, kan het gedrag onvoorspelbaar zijn.
  • Gebruik van blokkerende invoer/output operaties zonder ze in suspenderende functies te wikkelen (bijvoorbeeld lezen uit InputStream in een lus zonder withContext(Dispatchers.IO) en suspenderende methoden). Een blokkerende operatie controleert de coroutine status niet en gooit geen CancellationException.

Voor coöperatieve annulering moet de coroutine:

  1. Een dispatcher gebruiken die Cooperative Cancellation ondersteunt (bijvoorbeeld, Dispatchers.Default, Dispatchers.IO, Dispatchers.Main).
  2. Regelmatig isActive controleren of suspenderende functies gebruiken die dit voor haar doen.
  3. CancellationException correct afhandelen.