Middle+
Vannak olyan esetek, amikor nem tudjuk törölni a korutinokat?
sobes.tech MI
Válasz az MI-től
Igen, léteznek.
Ilyen esetek példái:
- A coroutine hosszú számítási feladatot végez rendszeres leállási ellenőrzések nélkül. A coroutine csak akkor ellenőrzi az
isActive-t, amikor szünetel (suspending). Ha a feladat nem szünetel (pl. hosszú ciklus vagy matematikai számítások), nem fogja észlelni a leállítási kérést. - A leállítási kivételek kezelése nem történik meg (pl. nem fogják el a
CancellationException-t). A coroutine befejeződhet, de a szülő coroutine vagy a feladatkezelő nem fog tudni a leállításáról, és az erőforrások nem kerülnek megfelelően felszabadításra. - Nem kooperatív ütemezők használata, mint például a
Dispatchers.Unconfinedvagy egy szálmedencés ütemező, amely nem támogatja a Kooperatív Leállítást. Bár aCancellationExceptiontovábbra is kivétel, a viselkedés kiszámíthatatlan lehet. - Blokkoló bemeneti/kimeneti műveletek használata anélkül, hogy suspending funkciókba csomagolnánk őket (pl.
InputStreamolvasása ciklusbanwithContext(Dispatchers.IO)és suspending módszerek nélkül). Egy blokkoló művelet nem ellenőrzi a coroutine állapotát, és nem dobCancellationException-t.
A kooperatív leállításhoz a coroutine-nak:
- Olyan ütemezőt kell használnia, amely támogatja a
Cooperative Cancellation-t (pl.Dispatchers.Default,Dispatchers.IO,Dispatchers.Main). - Rendszeresen ellenőriznie kell az
isActive-t, vagy olyan suspending funkciókat kell használnia, amelyek ezt megteszik helyette. - Helyesen kell kezelnie a
CancellationException-t.