2010-05-05 3 views
28

다음과 같은 문제가 있습니다 :스레드가 실행 완료되었는지 확인하는 방법

스레드가 실행을 마친 경우, 즉 스레드 메서드가 반환되었는지 확인 (C#)하고 싶습니다. 지금 내가하는 일은 Thread.Join(1)이지만 1ms의 지연이 있습니다. 스레드가 완료되었는지 단순히 확인하는 방법이 있습니까? 검열 Thread.ThreadState 그냥 너무 성가심 보인다.

답변

7

스레드가 끝나고 구독 할 때 이벤트를 실행할 수 있습니다.

또는 당신은 인수없이 Thread.Join()를 호출 할 수

블록 표준 COM 및 및 SendMessage 펌핑을 수행하기 위해 계속하는 동안 스레드가 종료 될 때까지 호출 스레드.

Thread.Join(1) 것입니다 :

블록 호출 스레드 표준 COM 및 및 SendMessage 펌핑을 수행하기 위해 계속하는 동안 스레드가 지정된 시간이 경과 종료 또는 때까지.

이 경우 지정된 시간은 1 밀리 초입니다.

+4

를 호출해야 현재 스레드는 결합하려는 스레드와 다릅니다. 그렇지 않으면 결코 돌아 오지 않을 것입니다. –

+0

@ 다니엘 - 좋은 지적입니다. – ChrisF

+0

@DanielRose 그들이 다른지 확인하는 방법에 대한 간단한 미리보기를 줄 수 있습니까? 감사. –

8

스레드의 경우 myThread.IsAlive 속성이 있습니다. 스레드 메소드가 반환되거나 스레드가 중단 된 경우에는 false입니다.

0

사용 방법에 따라 다릅니다. 조인을 사용하는 것이 한 가지 방법입니다. 그것을하는 또 다른 방법은 스레드가 이벤트를 사용하여 호출자에게 스레드를 알리는 것입니다. 예를 들어 잠시 동안 실행되는 프로세스를 호출하는 그래픽 사용자 인터페이스 (GUI) 스레드가 있고 완료 될 때 GUI를 업데이트해야하는 경우, 이벤트를 사용하여이를 수행 할 수 있습니다. 이 웹 사이트는 당신에게 이벤트를 사용하여 작업하는 방법에 대한 아이디어 제공 :

http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx

다른 스레드에서 GUI를 업데이트 할이 교차 스레딩 작업과 경우에 발생합니다 기억을, 당신은 사용해야합니다 Invoke 업데이트하려는 컨트롤의 메서드입니다.

7

Thread.Join(TimeSpan.Zero)으로 전화하지 않으시겠습니까? 호출자를 차단하지 않고 스레드가 작업을 완료했는지 여부를 나타내는 값을 반환합니다. 그건 그렇고, 모든 WaitHandle 클래스를 테스트하는 표준 방법입니다.

1

매개 변수없이 Join()을 호출하는 경우 호출 스레드의 현재 실행을 차단하지 않고 광범위하게 IsAlive를 사용합니다. 이제 대상 스레드가 어떤 이유로 든 실제로 실행을 시작하지 않은 경우 IsAlive가 false를 반환 할 수 있습니다.

카를로스 메리 그.

1

과 함께 BackgroundWorker Class을 살펴볼 수 있습니다.

+5

링크 만 대답하면 나쁜 대답이됩니다. 관련 정보를 답안에 포함시키고 왜 당신이 제안하고있는 것이 그 질문에 답하는 지 설명하십시오. – ChrisF

1

실행중인 다른 스레드 완료를 기다리거나 확인하여 현재 스레드를 차단하지 않으려면 다음과 같이 콜백 메소드를 구현할 수 있습니다.

Action onCompleted =() => 
{ 
    //On complete action 
}; 

var thread = new Thread(
() => 
    { 
    try 
    { 
     // Do your work 
    } 
    finally 
    { 
     onCompleted(); 
    } 
    }); 
thread.Start(); 

당신이 크로스 스레드 작업을 지원하지 않는 컨트롤을 처리하는 경우에, 당신은, 당신은 항상 확인해야 Thread.join를()를 호출하기 전에 콜백 메소드

this.invoke(onCompleted); 
+0

이것은 굉장합니다. 고맙습니다. – Yohannes

+0

id를 onCompleted() 콜백으로 다시 전달할 수 있습니까? – Mike