2012-07-17 3 views
3

다양한 형태와 다양한 스레드를 기반으로하는 응용 프로그램에 문제가 있습니다. 응용 프로그램이 종료되기 전에 스레드가 닫히지 만 응용 프로그램을 100 % 정확하게 종료 할 수는 없습니다.C# 응용 프로그램이 닫히지 않습니다.

때때로 프로세스가 계속 작동하지만 아무 것도 표시되지 않습니다 (Form 또는 심지어 Thread 초). 나는 문제가, 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

+0

당신이 할 수있는 일은 : 응용 프로그램이 환상 모드에있을 때, VS를 실행하고 프로세스에 연결합니다. 그런 다음 실행을 일시 중지하고 스레드를 표시합니다 (디버그 메뉴 => windows => threads). 시작한 스레드가 있습니까 (직접 또는 간접적으로)? – Kek

+0

삽입 된 DB 연결 스레드 코드 – AndreLucas13

답변

1

나는이 문제를 해결했다. 내 응용 프로그램은 Asterisk 서버와 연결하여 VOIP를 적용하기 위해 통합으로 사용합니다. 별표 (*)는 서버에 "로그인하고 로그 오프"할 수있는 스레드를 실행하며 스레드는 항상 사용자 코드 부분의 최종 응답을 기다리고 있습니다. Asterisk의 소스 코드를 살펴보면 스레드가 IsBackground가 아니고 로그 오프 기능을 기다리는 절전 모드임을 알았습니다. 이것이 대부분의 경우 응용 프로그램이 닫히지 않았고 지원 담당자에게 감사하는 이유입니다.

+0

스카이프와 같은 것. – Sam

4

일반적으로 종료 된 적이없는 일부 스레드가 있기 때문에 이런 현상이 발생합니다. UI 스레드가 아닌 스레드의 상태를 응용 프로그램에서 끝내려면 IsBackground 플래그를 true로 설정하여 응용 프로그램을 만들어야합니다.

+0

예 모든 스레드에 이미 있습니다. 나는 잠시 동안 실행되는 프로그램을 가지고 있지만, 응용 프로그램에서 "로그 아웃"하기 전에 플래그로 끝냅니다. 더 흥미로운 사실은 때로는 응용 프로그램이 잘 끝난다는 사실입니다.하지만 대부분의 경우에는 응용 프로그램이 끝나기 전에 닫혀 있더라도 스레드 문제라고 생각합니다. – AndreLucas13

+0

만약 당신이 할 수 있으면, 닫지 말고, 종료시키지 말고, 참여시키지 말고, 플래그를 설정하지 말고, 플래그를 폴링하거나 이벤트를 기다리지 마십시오. 앱을 종료하십시오.운영체제는 어떤 상태에 있거나 어떤 코어가 실행되고 있는지 상관없이 모든 스레드를 아무 문제없이 날려 버릴 수 있습니다. –

+0

@ Martin 제임스 나는 이미 그걸 시도해 보았는데, 문제는 생성과 스레드를 사용하거나 닫는 것 같지 않지만 솔루션을 찾을 수는 없다. – AndreLucas13

0

명시 적으로 스레드를 명시 적으로 종료해야하는 이유가없는 한 (몇 가지가 있습니다. 예를 들어, 모든 DB 연결이 종료 될 때 닫히고 해당 연결이 불완전하게 스레드를 생성 한 스레드), 명시 적으로 스레드를 종료하지 마십시오!

가능하다면 OS에서 처리하도록하십시오. 그것은 당신이나 내가 작성한 사용자 코드보다 더 낫습니다.

+0

그래서 문제가 너무 일찍 스레드를 종료하고 있습니까? 스레드 중 하나는 DB 연결 때문에 응용 프로그램이 종료되기 전에 종료되어야하지만 DB 연결이있는 유일한 스레드가 종료되어야합니다. 사용자 코드의 특정 시점에서 "주의"없이 모든 프로세스, 스레드 및 양식을 종료 할 수있는 방법이 있습니까? – AndreLucas13

+0

내가 틀렸다고 정정하십시오. 그러나 잠자기 상태이거나 AutoResetEvent를 기다리는 스레드가 있고 IsBackground로 스레드를 명시 적으로 설정하지 않은 경우이 스레드가 명시 적으로 종료 될 때까지 응용 프로그램이 종료되지 않습니다. .. 아니? (적어도이 문제는 내가 만난 문제이며 IsBackground를 설정하여 해결했습니다) – Kek

+0

예 잠자기 상태의 스레드는 isBackground 설정이 true로 설정되어 있습니다. 현재 문제가 사용자 인터페이스에 의해 닫힌 후에도 여전히 메모리에서 실행중인 양식인지 테스트하고 있습니다. – AndreLucas13

관련 문제