我在使用基于各种表单和各种线程的应用程序时出现问题。线程在应用程序结束之前关闭,但即便如此,我也无法以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”,但问题仍然存在。
答案 0 :(得分:4)
通常,这是因为您有一些从未被终止的线程。 为避免这种情况,如果您希望应用程序结束非UI线程的状态,则应创建它们,将IsBackground标志设置为true。
答案 1 :(得分:1)
我解决了这个问题。我的应用程序连接到Asterisk服务器并将其用作集成以在其上应用VOIP。 Asterisk运行一个线程,允许您“登录并注销”到服务器,该线程始终在等待用户代码部分的最终响应。检查Asterisk的源代码我注意到该线程不是IsBackground和Sleep等待注销功能。这就是为什么大多数时候应用程序都没有关闭的原因,并感谢你的支持人员。
答案 2 :(得分:0)
除非有绝对必须明确终止线程的最重要原因,(有一些,例如。规范说必须在退出时关闭所有数据库连接,并且你有这样的连接,这些连接是绝对绑定到线程的/ s创建它们),不要显式终止线程!
如果可以,请让操作系统执行此操作。它比你或我写的用户代码更好。