2012-07-17 78 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