다음과 같은 문제가 있습니다 :스레드가 실행 완료되었는지 확인하는 방법
스레드가 실행을 마친 경우, 즉 스레드 메서드가 반환되었는지 확인 (C#)하고 싶습니다. 지금 내가하는 일은 Thread.Join(1)
이지만 1ms의 지연이 있습니다. 스레드가 완료되었는지 단순히 확인하는 방법이 있습니까? 검열 Thread.ThreadState
그냥 너무 성가심 보인다.
다음과 같은 문제가 있습니다 :스레드가 실행 완료되었는지 확인하는 방법
스레드가 실행을 마친 경우, 즉 스레드 메서드가 반환되었는지 확인 (C#)하고 싶습니다. 지금 내가하는 일은 Thread.Join(1)
이지만 1ms의 지연이 있습니다. 스레드가 완료되었는지 단순히 확인하는 방법이 있습니까? 검열 Thread.ThreadState
그냥 너무 성가심 보인다.
왜 아니야 Thread.IsAlive
플래그. 이것은 스레드 상태를 제공하기위한 것입니다.
스레드가 끝나고 구독 할 때 이벤트를 실행할 수 있습니다.
또는 당신은 인수없이 Thread.Join()
를 호출 할 수
블록 표준 COM 및 및 SendMessage 펌핑을 수행하기 위해 계속하는 동안 스레드가 종료 될 때까지 호출 스레드.
Thread.Join(1)
것입니다 :
블록 호출 스레드 표준 COM 및 및 SendMessage 펌핑을 수행하기 위해 계속하는 동안 스레드가 지정된 시간이 경과 종료 또는 때까지.
이 경우 지정된 시간은 1 밀리 초입니다.
스레드의 경우 myThread.IsAlive
속성이 있습니다. 스레드 메소드가 반환되거나 스레드가 중단 된 경우에는 false입니다.
사용 방법에 따라 다릅니다. 조인을 사용하는 것이 한 가지 방법입니다. 그것을하는 또 다른 방법은 스레드가 이벤트를 사용하여 호출자에게 스레드를 알리는 것입니다. 예를 들어 잠시 동안 실행되는 프로세스를 호출하는 그래픽 사용자 인터페이스 (GUI) 스레드가 있고 완료 될 때 GUI를 업데이트해야하는 경우, 이벤트를 사용하여이를 수행 할 수 있습니다. 이 웹 사이트는 당신에게 이벤트를 사용하여 작업하는 방법에 대한 아이디어 제공 :
http://msdn.microsoft.com/en-us/library/aa645739%28VS.71%29.aspx
다른 스레드에서 GUI를 업데이트 할이 교차 스레딩 작업과 경우에 발생합니다 기억을, 당신은 사용해야합니다 Invoke
업데이트하려는 컨트롤의 메서드입니다.
Thread.Join(TimeSpan.Zero)
으로 전화하지 않으시겠습니까? 호출자를 차단하지 않고 스레드가 작업을 완료했는지 여부를 나타내는 값을 반환합니다. 그건 그렇고, 모든 WaitHandle
클래스를 테스트하는 표준 방법입니다.
매개 변수없이 Join()을 호출하는 경우 호출 스레드의 현재 실행을 차단하지 않고 광범위하게 IsAlive를 사용합니다. 이제 대상 스레드가 어떤 이유로 든 실제로 실행을 시작하지 않은 경우 IsAlive가 false를 반환 할 수 있습니다.
카를로스 메리 그.
과 함께 BackgroundWorker Class을 살펴볼 수 있습니다.
링크 만 대답하면 나쁜 대답이됩니다. 관련 정보를 답안에 포함시키고 왜 당신이 제안하고있는 것이 그 질문에 답하는 지 설명하십시오. – ChrisF
실행중인 다른 스레드 완료를 기다리거나 확인하여 현재 스레드를 차단하지 않으려면 다음과 같이 콜백 메소드를 구현할 수 있습니다.
Action onCompleted =() =>
{
//On complete action
};
var thread = new Thread(
() =>
{
try
{
// Do your work
}
finally
{
onCompleted();
}
});
thread.Start();
당신이 크로스 스레드 작업을 지원하지 않는 컨트롤을 처리하는 경우에, 당신은, 당신은 항상 확인해야 Thread.join를()를 호출하기 전에 콜백 메소드
this.invoke(onCompleted);
를 호출해야 현재 스레드는 결합하려는 스레드와 다릅니다. 그렇지 않으면 결코 돌아 오지 않을 것입니다. –
@ 다니엘 - 좋은 지적입니다. – ChrisF
@DanielRose 그들이 다른지 확인하는 방법에 대한 간단한 미리보기를 줄 수 있습니까? 감사. –