L’application C # ne ferme pas

J’ai un problème avec mon application qui se base sur diverses formes et différents threads. Les threads se ferment avant la fin de l’application, mais je ne peux cependant pas terminer mon application avec une précision de 100%.

Parfois, le processus continue à fonctionner mais rien ne s’affiche ( Form s ou même Thread s). Je pense que le problème est sur program.cs, presque sûr, donc je vais coller ici le code

  private static Process old; ///  /// The main entry point for the application. ///  [STAThread] static void Main() { XmlConfigurator.Configure(); if (PriorProcess() != null) { try { old.Kill(); } catch (Exception ex) { MessageBox.Show("Ja existe uma instancia do SpotLight em execucao.", "Aviso"); return; } } Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Support()); } public static Process PriorProcess() { Process curr = Process.GetCurrentProcess(); Process[] procs = Process.GetProcessesByName(curr.ProcessName); foreach (Process p in procs) { if ((p.Id != curr.Id) && (p.MainModule.FileName == curr.MainModule.FileName)) { old = p; return p; } } return null; } 

New Support() mon premier formulaire à apparaître dans l’application.

Ceci est le code pour les threads:

 private void check_calls() { while (stop==false) { ssortingng actualTime = DateTime.Now.ToSsortingng("T"); connection = new MySqlConnection(ConnectionSsortingng); MySql.Data.MySqlClient.MySqlCommand msqlCommand = new MySql.Data.MySqlClient.MySqlCommand(); msqlCommand.Connection = connection; msqlCommand.CommandText = "Select cd.uniqueid,sup.timespan from contactCenterDevel.cc_cdr_support_pending sup, vboxZon.cdr cd WHERE sup.phone=cd.src AND cd.finish=0 AND cd.accountcode='serviin' AND cd.duration >0 AND cd.lastapp='Vxml' ORDER BY cd.calldate DESC LIMIT 1"; try { connection.Open(); MySql.Data.MySqlClient.MySqlDataReader msqlReader = msqlCommand.ExecuteReader(); while (msqlReader.Read()) { int timespanCompare = convertTimetoSecs(msqlReader.GetSsortingng(1)); int actualtimeCompare = convertTimetoSecs(actualTime); if (timespanCompare < actualtimeCompare) { updateFlagCDR(msqlReader.GetString(0)); } } } catch (Exception er) { MessageBox.Show("Mysql actions error: " + er); } finally { connection.Close(); } Thread.Sleep(10000); } } 

Celui-ci s’arrête lorsque le drapeau “stop” devient true sur ma fonction de déconnexion. J’ai déjà essayé de commenter “thread.sleep” mais le problème persiste.

Habituellement, cela se produit car vous avez des threads qui n’ont jamais été terminés. Pour éviter cela, si vous souhaitez que votre application se termine quel que soit le statut des threads non-interface utilisateur, vous devez les créer en définissant l’indicateur IsBackground sur true.

J’ai résolu le problème. Mon application se connecte à un serveur Asterisk et l’utilise comme intégration pour y appliquer VOIP. Asterisk exécute un thread qui vous permet de “vous connecter et de vous déconnecter” sur le serveur et que ce thread attend toujours une réponse finale de la part du code utilisateur. Vérification du code source d’Asterisk J’ai remarqué que le thread n’est pas comme IsBackground et que Sleep attend une fonction de fermeture de session. C’est la raison pour laquelle la plupart du temps, l’application n’a pas été clôturée et merci pour votre soutien.

À moins qu’il y ait une raison impérieuse pour laquelle vous devez absolument terminer les threads explicitement (il y en a quelques-unes, par exemple, la spécification dit que toutes les connexions à la firebase database doivent être fermées à la sortie et que vous avez les a créés), ne résiliez pas explicitement les threads!

Si vous le pouvez, laissez simplement le système d’exploitation le faire. C’est beaucoup mieux que le code utilisateur écrit par vous ou moi.