2011-09-13 3 views
2
public void WriteToLog(string Msg) 
{ 
    //Write to Log 
} 

public static void Apple() 
{ 
    WriteToLog("Apple Started"); // third log line 
} 

public void CallFunction() 
{ 
    Thread EmailThread = new Thread(new ThreadStart(Apple)); 
    WriteToLog(EmailThread.ThreadState.ToString()); // first log line 
    EmailThread.Start(); 
    WriteToLog(EmailThread.ThreadState.ToString()); // second log line 
} 

로그 파일에 첫 줄과 두 번째 줄이 표시됩니다. 하지만 제 3의 라인을 얻을 수 없습니다.ASP.NET의 스레드에 대한 이상한 동작

단순히 Apple 함수를 호출하면 세 번째 행을 가져올 수 있습니다.

이고 첫 번째 줄은 Unstarted이고 두 번째 줄은 running입니다.

세 번째 줄이 없습니다.

제가 second log line 아래 while 루프 물품

while(EmailThread.ThreadState.ToString()=="Running") 
{ 
    WriteToLog("Thread running"); 
} 

이것은 무한 반복된다. IIS를 중단해야했습니다.

이상한 행동입니까?

Apple 내부의 모든 기능이 작동하지 않는 것 같습니다.

스레드 상태가 실행 중입니다.

I lost. 어떤 생각?

또는 새 스레드로 인해 로그 파일에 쓸 수 없습니까? 같은 로그 파일? 그러나 나는 이미 2 개의 다른 로그 파일을 시도했다. 아직 작동하지 않습니다 ...

Apple의 시작 부분에 로그 파일에 쓸 함수를 작성했습니다.

+2

왜 스레드를 사용하고 있습니까? 당신은 내가 당신이 처음에 그것을 필요로하지 않는다고 믿을만한 좋은 이유 인 다중 쓰레드 코드를 작성하는 방법에 대한 이해가 부족한 것처럼 보입니다. ASP.NET은 자체 스레드 풀을 가지고 있으며 효과적으로 들어오는 요청을 다중 스레드합니다. 당신은 스스로 할 필요가 없습니다. – x0n

+0

그것은 스레드를 사용하고있는 것은 아니지만 .. 스레드를 사용하여 코드를 수정하고 있습니다. – william

+0

어떤 로그를 사용하고 있습니까? 제공하는 코드에서 볼 수없는 파일 잠금이있을 수 있습니다. 로그 코드에 실제 쓰기를 보여 주므로 Thread.Start()가 작동하고 있음을 알 수 있습니다. –

답변

1

로깅 메커니즘이 멀티 스레드입니까?

로깅이 한 번에 하나의 스레드에서만 발생하는지 확인하기 위해 코드에 중요한 섹션을 추가하는 것이 좋습니다. 그렇지 않으면 버퍼를 플러시하거나 출력 또는 재미있는 것을 덮어 쓸 수 있습니다. 도움이

static readonly object threadLock = new object(); 

public void WriteToLog(string Msg) 
{ 
    lock(threadLock) 
    { 
     //Write to Log 
    } 
} 

희망 :

이 이런 식으로 뭔가를 구현 수행합니다.

또한 내가 스레드 지역 변수하게하지 않으려 고 할

업데이트되었습니다. 코드가 실행되기 전에 최종 확정 될 가능성이 있습니다. 다음과 같이 클래스의 필드로 정의하십시오.

public class SomeClass 
{ 
    private Thread EmailThread; 

    public void WriteToLog(string Msg) 
    { 
     //Write to Log 
    } 

    public static void Apple() 
    { 
     WriteToLog("Apple Started"); // third log line 
    } 

    public void CallFunction() 
    { 
     EmailThread = new Thread(new ThreadStart(Apple)); 
     WriteToLog(EmailThread.ThreadState.ToString()); // first log line 
     EmailThread.Start(); 
     WriteToLog(EmailThread.ThreadState.ToString()); // second log line 
    } 
} 
+0

아니요. 내가 결코 만진 적이없는 몇 가지 스레드가 있습니다. 즉, 해당 스레드가 로그 기능에 기록하지 않습니다. 그들은 결코 작동하지 않았습니다 ... – william

+0

@william이 경우 알려주십시오 모든 것을 돕는다. –