J'ai vu plusieurs messages sur SO qui sont similaires à ma question, mais aucun d'entre eux n'a résolu mon problème. Je crée un service Windows qui va interroger une base de données Redis toutes les quelques secondes et effectuer une action basée sur le résultat. Je voudrais créer un "pool de threads" de sorte que je puisse exécuter plusieurs actions en même temps si j'obtiens un résultat de Redis pendant qu'une autre commande est en cours de traitement (sur un autre thread).Boucle infinie en utilisant des threads dans Windows Service
L'un de mes principaux problèmes est que lorsque j'arrêter mon service Windows, le processus reste encore en vie à 30 secondes ou si au lieu de fermer. Voici les extraits de code pertinents:
Thread Worker;
IDatabase db = ...;
AutoResetEvent StopRequest = new AutoResetEvent(false);
protected override void OnStart(string[] args) {
var poller = new Poller();
Worker = new Thread(() => poller.Poll(StopRequest));
Worker.Start();
}
protected override void OnStop() {
// Signal worker to stop and wait until it does
StopRequest.Set();
Worker.Join();
}
Voici un exemple des Poller
classes de méthode Poll
.
public async void Poll(AutoResetEvent finished)
{
var res = string.Empty;
while (!finished.WaitOne(1000))
{
res = db.StringGet($"task");
if (!String.IsNullOrEmpty(res))
{
ParseAction(res);
}
db.KeyDelete($"task");
}
}
donc ce code (avec beaucoup coupé sur) reste en cours d'exécution en arrière-plan correctement et semble traiter les requêtes entrantes de Redis très bien, mais je vais avoir le problème avec le processus ne ferme pas correctement que je mentionné ci-dessus. Je ne suis pas sûr que ce soit la meilleure approche à adopter pour cette situation. J'aimerais des pointeurs sur des façons meilleures ou plus «idiomatiques» de gérer ce problème de threading.
Merci!