Coroutine::cancel
(PHP 8.6+, True Async 1.0)
public Coroutine::cancel(?Async\AsyncCancellation $cancellation = null): void
Annulla l’esecuzione della coroutine. La coroutine riceverà un’eccezione AsyncCancellation al prossimo punto di sospensione (suspend, await, delay, ecc.).
L’annullamento funziona in modo cooperativo – la coroutine non viene interrotta istantaneamente. Se la coroutine è all’interno di protect(), l’annullamento viene posticipato fino al completamento della sezione protetta.
Parametri
- cancellation
- L’eccezione che funge da motivo dell’annullamento. Se
null, viene creata un’AsyncCancellationpredefinita.
Esempi
Esempio #1 Annullamento base
<?php
use function Async\spawn;
use function Async\suspend;
use function Async\await;
$coroutine = spawn(function() {
try {
Async\delay(10000);
} catch (\Async\AsyncCancellation $e) {
echo "Annullato: " . $e->getMessage() . "\n";
}
});
suspend();
$coroutine->cancel();
await($coroutine);
Esempio #2 Annullamento con motivo
<?php
use function Async\spawn;
use function Async\await;
$coroutine = spawn(function() {
Async\delay(10000);
});
$coroutine->cancel(new \Async\AsyncCancellation("Timeout superato"));
try {
await($coroutine);
} catch (\Async\AsyncCancellation $e) {
echo $e->getMessage() . "\n"; // "Timeout superato"
}
Esempio #3 Annullamento prima dell’avvio
<?php
use function Async\spawn;
use function Async\await;
$coroutine = spawn(function() {
return "non dovrebbe completarsi";
});
// Annulla prima che lo scheduler avvii la coroutine
$coroutine->cancel();
try {
await($coroutine);
} catch (\Async\AsyncCancellation $e) {
echo "Coroutine annullata prima dell'avvio\n";
}
Vedi anche
- Coroutine::isCancelled – Verifica l’annullamento
- Coroutine::isCancellationRequested – Verifica la richiesta di annullamento
- Cancellazione – Concetto di annullamento
- protect() – Sezione protetta