C#应用程序不closures

我在基于各种forms和各种线程的应用程序中遇到了麻烦。 线程在应用程序结束之前closures,但即使如此,我也无法以100%的精度终止我的应用程序。

有时候这个过程还在继续,但是没有任何东西出现( Form s甚至Thread )。 我认为问题是在program.cs上,几乎可以肯定,所以我在这里粘贴代码

  private static Process old; /// <summary> /// The main entry point for the application. /// </summary> [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()是我的第一种forms出现在应用程序中。

这是线程的代码:

 private void check_calls() { while (stop==false) { string actualTime = DateTime.Now.ToString("T"); connection = new MySqlConnection(ConnectionString); 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.GetString(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); } } 

当我的注销function中的标志“停止”更改为真时,这个停止。 我已经试过评论“thread.sleep”,但问题仍然出现。

通常,这是因为你有一些从未被终止的线程。 为了避免这种情况,如果希望应用程序结束任何非UI线程的状态,则应创建它们,将IsBackground标志设置为true。

我解决了这个问题。 我的应用程序连接到一个Asterisk服务器,并将其作为一个集成应用VOIP。 Asterisk运行一个线程,允许你“登录和注销”到服务器,该线程总是等待来自用户代码部分的最终响应。 检查Asterisk的源代码我注意到线程不是IsBackground和等待注销函数的Sleep。 这就是为什么大多数时候应用程序没有关闭,谢谢你的支持人员。

除非有一个压倒一切的原因,为什么你必须明确地终止线程(有几个,例如规范说,所有的数据库连接必须在退出时关闭,并且你有这样的连接,绝对绑定到线程创建它们),不要明确地终止线程!

如果可以的话,让操作系统去做。 它比你或我写的用户代码更好。