2010-12-15 3 views
7

설명하기 어려운 상황입니다. 2 개의 스레드를 시작하는 서비스 프로세스가 있고 각 스레드는 영원히 반복되지만 페이로드가 완료되면 각각 5 분간 잠자기 상태가됩니다.StackOverflowException으로 인해 프로세스가 종료되었습니다.

문제는 두 번째 스레드가 페이로드가 짝수 번째로 종료되기 전에 종료되기 때문에 명백한 이유가 없기 때문이며 대리인 프로세스 외부에서 트리거 된 것으로 보이는 예외도 잡을 수 없습니까?

문제를 찾는 방법에 대한 제안 사항이 있으십니까?

코드 ....

public void StartService() 
{ 
    ThreadStart stRecieve = new ThreadStart(DownloadNewMail); 
    ThreadStart stSend = new ThreadStart(SendNewMail); 
    senderThread = new Thread(stRecieve); 
    recieverThread = new Thread(stSend); 

    sendStarted = true; 
    recieveStarted = true; 

    senderThread.Start(); 
    recieverThread.Start(); 
} 

private void DownloadNewMail() 
{ 
    while(recieveStarted) 
    { 
    //Payload.... 

    if (recieveStarted) 
    { 
     Thread.Sleep(new TimeSpan(0, confSettings.PollInterval, 0)); 
    } 
    } 
} 

private void SendNewMail() 
{ 
    while(sendStarted) 
    { 
    //Payload.... 

    if (sendStarted) 
    { 
     Thread.Sleep(new TimeSpan(0, confSettings.PollInterval, 0)); 
    } 
    } 

}

+6

'StackOverflowException '은 너무 깊은 반복 또는 순환 인스턴스화에 의해 종종 발생합니다. 어디서나 재귀를 사용하고 있습니까? – LukeH

+5

"각 스레드는 영원히 반복됩니다"<- 여기에 코드 –

+0

정적으로 스레드를 생성하여 문제를 해결할 수있었습니다. –

답변

4

마 DownloadNewMail 및 SendNewMail과 같은 작업을 위해 무거운 무게의 라이브러리를 활용할 수 있습니까? 예를 들어 Microsoft.SqlServer.Dts.Runtime.Package를 사용하여 큰 작업을 실행할 때 StackOverflows가 발생했습니다. 명령 줄 응용 프로그램 내에서 동일한 작업을 순차적으로 실행하여 문제가 지속되는지 확인하십시오.

+0

페이로드가 간단한 쓰레딩을 위해 매우 무거워 보인다. Quatz 작업을 대신보고 있습니다 ... .NET 4.0에서이 문제를 사용하고있는 것 같지만 –

6

당신이 응용 프로그램의 코드 실행의 흐름을 다음과 같은 문제가있는 경우는, 타임 스탬프 방법의 입구에 로그인을 시도하고 threadid.

또한 StackOverflowException이기 때문에 예외를 catch 할 수 없습니다.

msdn : ".NET Framework 버전 2.0부터는 StackOverflowException 개체가 try-catch 블록에 의해 catch 될 수 없으며 해당 프로세스가 기본적으로 종료되므로 사용자는 해당 코드를 검색하여 스택 오버 플로우를 방지 응용 프로그램이 재귀에 의존하는 경우 예를 들어, 재귀 루프를 종료 카운터 또는 상태 조건을 사용하여 "

+4

MSDN의 해당 게시물을보고 "와우 ... 사람들이 StackOverflowExceptions를 사용하여 재귀 루프를 벗어났습니다." –

8

시도를 코드에서 호출 스택의 아이폰에를 확인 :..

class Program 
{ 
    static void Main(string[] args) 
    { 
     try 
     { 
      Hop(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("Exception - {0}", e); 
     } 
    } 

    static void Hop() 
    { 
     CheckStackTrace(); 
     Hip(); 
    } 

    static void Hip() 
    { 
     CheckStackTrace(); 
     Hop(); 
    } 

    static void CheckStackTrace() 
    { 
     StackTrace s = new StackTrace(); 
     if (s.FrameCount > 50) 
      throw new Exception("Big stack!!!!"); 
    } 
} 
관련 문제