C#应用程序没有关闭

时间:2012-07-17 13:53:57

标签: c# windows winforms multithreading

我在使用基于各种表单和各种线程的应用程序时出现问题。线程在应用程序结束之前关闭,但即便如此,我也无法以100%的准确率终止我的应用程序。

有时,该过程仍然有效,但没有任何显示(Form甚至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);
    }   
}

当我的注销功能将标志“stop”更改为true时,此停止。我已经尝试过评论“thread.sleep”,但问题仍然存在。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

除非有绝对必须明确终止线程的最重要原因,(有一些,例如。规范说必须在退出时关闭所有数据库连接,并且你有这样的连接,这些连接是绝对绑定到线程的/ s创建它们),不要显式终止线程!

如果可以,请让操作系统执行此操作。它比你或我写的用户代码更好。