2008-08-09 2 views
8

.NET CF 2.0에서 스레드를 시작하는 데 필요한 몇 가지 코드가 있습니다.계속하기 전에 스레드가 완료 될 때까지 기다리는 방법?

ThreadStart tStart = new ThreadStart(MyMethod); 
Thread t = new Thread(tStart); 
t.Start(); 

이 코드를 루프 내부에서 호출하면 항목이 순서대로 완료됩니다. 코드가 계속되기 전에 스레드에서의 작업이 완료되도록 t.Start() 이후 대기를 어떻게 시작합니까? 수동으로 스레드를 만드는 것보다 BeginInvoke/EndInvoke가 더 좋은 옵션일까요?

답변

9

얼마나 위해 당신이 스레드에 부과해야합니까? 코드가 계속되기 전에 루프에서 시작된 모든 작업을 완료해야하지만 루프 내의 작업이 완료되는 순서는 신경 쓰지 않으면 조인을 호출하면됩니다. Kevin Kenny's answer,에 자세한 내용을 추가하려면 외부의 루프를 호출해야합니다. 이것은 당신이 시작 스레드에 대한 참조를 개최 컬렉션을해야합니다 의미 : 당신은 루프 내부에 가입라고하면 모든 스레드를 사용하지

// Start all of the threads. 
List<Thread> startedThreads = new List<Thread>(); 
foreach (...) { 
    Thread thread = new Thread(new ThreadStart(MyMethod)); 
    thread.Start(); 
    startedThreads.Add(thread); 
} 

// Wait for all of the threads to finish. 
foreach (Thread thread in startedThreads) { 
    thread.Join(); 
} 

대조적으로, 결과는 기본적으로 동일하다. 루프 본문을 반복 할 때마다 스레드가 만들어지고 시작되지만 즉시 결합되어 완료 될 때까지 기다립니다.

개별 스레드가 결과를 생성하는 경우 (예 : 로그에 메시지 쓰기) 스레드간에 조정이 없기 때문에 메시지가 여전히 순서가 잘못된 것처럼 보일 수 있습니다. 스레드를 모니터와 조정하여 결과를 순서대로 출력 할 수 있습니다.

2

제대로 읽는다면 작업 항목을 여러 스레드에서 시작하지만 스레드가 순서가 맞지 않아 각각의 스레드가 순서대로 완료 될 때까지 기다리는 것이 좋습니다. 시작 됐어?

이 경우 작업 항목 당 스레드를 만드는 이유가 확실하지 않습니다. 너 확장 할 수 있을까?

당신이 완료 스레드를 기다릴 필요 않았다면 당신이 단지 수 :

t.Join(); 
4

스레드가 완료 될 때까지 기다리는 또 다른 방법은 AutoResetEvent입니다.

private readonly AutoResetEvent mWaitForThread = new AutoResetEvent(false); 

private void Blah() 
{ 
    ThreadStart tStart = new ThreadStart(MyMethod); 
    Thread t = new Thread(tStart); 
    t.Start(); 

    //... (any other things) 
    mWaitForThread.WaitOne(); 
} 

private void MyMethod() 
{ 
    //... (execute any other action) 
    mWaitForThread.Set(); 
}