2012-07-17 88 views
3

我遇到了基于各种形式和各种线程的应用程序的问题。线程在应用程序结束之前关闭,但即使如此,我也无法以100%的准确性终止我的应用程序。C#应用程序不关闭

有时过程仍然继续,但没有任何显示(Form s或甚至Thread s)。我认为这个问题是在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()显示应用起来了我的第一种形式。

这是线程的代码:

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); 
    } 
} 

当标志“停止”更改为true在我的注销功能这一个停止。我已经尝试评论“thread.sleep”,但问题仍然出现。

+0

您可以请发布*主应用程序线程*如何结束的代码? – GregRos 2012-07-17 14:22:22

+0

你可以做的是:当你的应用程序处于幻想模式时,你运行VS并将它附加到你的进程中。然后,你暂停执行并显示线程(Debug menu => windows => threads)。有没有你开始的任何线程(直接或间接)? – Kek 2012-07-17 14:27:58

+0

插入数据库连接代码的代码 – AndreLucas13 2012-07-17 15:13:09

回答

1

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

+0

与Skype相同的东西。 – Sam 2016-07-19 12:17:58

4

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

+0

是的,我已经在每一个线程上都有。我只是有一个运行一段时间,但我结束之前“注销”我的应用程序标志。 让我更感兴趣的事情是有时候应用程序结束了,但大部分时间它已经结束了,所以这个事实我也认为它是一个线程问题,虽然它们在应用程序结束之前被关闭。 – AndreLucas13 2012-07-17 14:11:44

+0

如果你完全可以,不要关闭,不要终止,不要加入(),不要设置任何标志,不要轮询任何标志或等待任何事件。只需退出应用程序。无论操作系统处于何种状态或运行的核心是什么,操作系统都将无视您的所有线程,无任何问题。 – 2012-07-17 14:56:08

+0

@马丁詹姆斯我已经尝试过,似乎问题不在于创建,使用或关闭线程,但我仍然无法找到解决方案。 – AndreLucas13 2012-07-17 15:30:31

0

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

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

+0

所以问题是过早地终止线程?其中一个线程需要在应用程序终止之前终止,因为数据库连接,但它是唯一具有数据库连接的连接。 没有一种方式,我可以终止所有的进程,线程和表单,而不需要在用户代码的某些点“照顾”? – AndreLucas13 2012-07-17 14:57:40

+0

如果我错了,请纠正我,但是如果您有睡眠中的线程或正在等待AutoResetEvent ...并且您没有显式地使用IsBackground设置线程,那么应用程序将不会退出,直到此线程显式终止。 ..不是? (至少这是我遇到的问题,我通过设置IsBackground来解决它) – Kek 2012-07-17 15:02:50

+0

是的睡眠线程isBackground设置为true。我目前正在测试如果问题是一种表单,即使在用户界面关闭它之后,它仍然在内存中运行。 – AndreLucas13 2012-07-17 15:23:04