après avoir lu quelques articles, je ne suis toujours pas sûr de comprendre le multi-threading pour résoudre mon problème particulier .Comment attendre le fil de travail dans le formulaire principal?
J'ai un formulaire principal qui va démarrer un thread de travail d'arrière-plan (travailleur). Le thread de travail effectuera une boucle infinie While (! Stop) et s'arrêtera à la fin de chaque itération se terminera par l'objet global Stop (objet de verrouillage en lecture seule). Avec le bon fonctionnement lorsque l'utilisateur appuie sur le bouton Stop, le travailleur s'arrête après l'itération en cours.
Maintenant, je veux que lorsque l'utilisateur ferme le formulaire principal, il va d'abord mettre le drapeau d'arrêt, laisser le travailleur finir son travail actuel. Après cela, le formulaire principal se fermera. Semble assez simple, mais je ne pouvais pas le faire fonctionner.
J'ai essayé soit worker.Join(), soit test woker.IsAlive dans une boucle while, mais les deux cas vont verrouiller l'application (Mainform) après quelques secondes pour une raison quelconque?
Ce qui suit est mon code à l'intérieur gestionnaire d'événements Form_Closing (ne fonctionne pas):
// Tell the thread to stop the file
Stop();
Logger.Info("Stopping the thread by Close the application");
//Not working as well
//worker.Join();
while (worker.IsAlive)
{
Thread.Sleep(5000);
Logger.Info("After sleep for 5 seconds");
}
Logger.Info("worker thread stopped");
Une chose intéressante est que le thread de travail semble écrit toujours du journal des événements jusqu'à la fin de chaque itération de boucle, puis le reste de l'entrée de journal sera l'événement de formulaire principal à l'intérieur de la boucle while (worker.IsAlive).
Merci, cette solution semble bien fonctionner. –