Ciao Lucius
Nella documentazione Microsoft spiegano bene il funzionamento del background worker (
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-5.0&tabs=visual-studio )
In pratica:
- StartAsync viene richiamato con un CancellationToken che il sistema imposta come "cancellation request" quando il servizio deve fermarsi.
- Se non viene gestito correttamente (fermato in breve tempo), viene detto che il servizio viene killato brutalmente
Probabilmente ti server implementare il metodo StopAsync perchè il tempo necessario per terminare le tue operazioni supera il limite che Windows considera valido prima di killarlo brutalmente.
A questo scopo puoi valutare tu se sia più corretto implementare lo StopAsync (più o meno come hai fatto) o se abortire le modifiche che stai facendo (rollback della transazione). Ovviamente se il tuo obbiettivo è "terminare le operazioni in corso" allora va bene implementare StopAsync, però stai in occhio: se ci mette troppo, comunque chi spegne il PC può dire di terminare brutalmente il processo (a volte viene il messaggio "il processo X ci sta mettendo troppo. Forzare interruzione?"
Detto questo, faccio due commenti sul codice che hai postato. Prendili come suggerimenti qualora quello fosse il tuo codice vero, se è solo un esempio buttato lì, allora ignora pure:
- Nella ExecuteAsync usi il metodo "Sleep" della classe Thread. Di solito nel paradigma async/await è più adatto un "await Task.Delay(x)"
- Nella StopAsync fai un ciclo while (occupato). Di suo tutto bene, però sarebbe bene mettere al suo interno un Task.Delay, altrimenti il processore continua a ciclare su quella if usando delle risorse inutili. Anche un Delay di un centesimo di secondo può fare la differenza
- Spesso viene usata una variabile boolean come la tua "occupato". A me personalmente piace di più l'approccio del SemaphoreSlim, così si evita proprio l'uso del ciclo "while" poichè gestito tutto dal semaforo.
Vedi te.
Ciao e buona giornata