【问题标题】:C# application doesn't closeC# 应用程序没有关闭
【发布时间】:2012-07-16 11:06:43
【问题描述】:

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

有时该过程仍会继续工作,但没有任何显示(Forms 甚至Threads)。我认为问题出在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);
    }   
}

当我的注销功能上的标志“停止”更改为真时,这个停止。我已经尝试过注释“thread.sleep”,但问题仍然出现。

【问题讨论】:

  • 你能把主应用线程如何结束的代码贴出来吗?
  • 您可以做的是:当您的应用程序处于 fantom 模式时,您运行 VS 并将其附加到您的进程。然后,您暂停执行并显示线程(调试菜单 => 窗口 => 线程)。您是否(直接或间接)启动了任何线程?
  • 插入的数据库连接线程代码
  • @Kek 我按照你说的做 KeK 并且没有线程仍在运行。
  • 我解决了这个问题。我的应用程序与 Asterisk 服务器连接,并将其用作集成以在其上应用 VOIP。 Asterisk 运行一个线程,允许您“登录和注销”到服务器,并且该线程始终等待来自用户代码部分的最终响应。检查 Asterisk 的源代码,我注意到该线程不是 IsBackground 而是等待注销功能的 Sleep。这就是大多数时候应用程序没有关闭的原因,感谢你们的支持。

标签: c# windows winforms multithreading


【解决方案1】:

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

【讨论】:

  • 是的,我已经在每个线程上都有了。我只有一个运行一段时间,但我在“注销”我的应用程序之前用一个标志结束它。更让我感兴趣的是,有时应用程序结束得很好,但大多数时候它确实如此,所以我也认为这是一个线程问题,尽管它们在应用程序结束之前就被关闭了。
  • 如果可以,不要关闭,不要终止,不要加入(),不要设置任何标志,不要轮询任何标志或等待任何事件。只需退出应用程序。操作系统会吹走你所有的线程,没问题,无论它们处于什么状态或它们可能在什么内核上运行。
  • @Martin James 我已经试过了,看来问题不在于线程的创建、使用或关闭,但我仍然无法找到解决方案。
【解决方案2】:

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

【讨论】:

  • Skype 也一样。
【解决方案3】:

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

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

【讨论】:

  • 所以问题是过早终止线程?由于数据库连接,需要在应用程序终止之前终止其中一个线程,但它是唯一具有数据库连接的线程。有没有一种方法可以让我在用户代码的某个点无需“关心”就终止所有进程、线程和表单?
  • 如果我错了,请纠正我,但是如果您有一个线程处于睡眠状态或等待 AutoResetEvent... 并且您没有使用 IsBackground 显式设置线程,那么应用程序将不会退出直到这个线程被明确终止......不是吗? (至少这是我遇到的一个问题,我通过设置IsBackground解决了)
  • 是的,睡眠线程的 isBackground 设置为 true。我目前正在测试问题是否是一个表单,即使在通过用户界面关闭它后,它仍然在内存中运行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-21
相关资源
最近更新 更多