계속하기 전에 스레드가 완료될 때까지 기다리는 방법은 무엇인가요?

.NET CF 2.0에서 스레드를 시작하기 위한 코드가 몇 가지 있습니다:

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

루프 안에서 이것을 호출하면 항목이 완전히 순서대로 정렬되지 않습니다. t.Start()` 뒤에 대기를 도입하여 코드가 계속되기 전에 스레드 작업이 완료되도록하려면 어떻게해야합니까? 수동으로 스레드를 생성하는 것보다 BeginInvoke/EndInvoke가 더 나은 옵션인가요?

해결책

스레드에 얼마나 많은 순서를 부과해야 할까요? 루프에서 시작된 모든 작업이 코드가 계속되기 전에 완료되어야 하지만 루프 내의 작업이 완료되는 순서는 신경 쓰지 않는 경우 Join을 호출하는 것이 정답입니다. 케빈 케니의 답변]1에 더 자세한 내용을 추가하려면 루프 외부에서 Join을 호출해야 합니다. 즉, 시작한 스레드에 대한 참조를 보관할 컬렉션이 필요합니다:

// Start all of the threads.
List startedThreads = new List();
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();
}

반대로 루프 내부에서 Join을 호출하면 결과는 기본적으로 스레드를 전혀 사용하지 않는 것과 동일합니다. 루프 본문을 반복할 때마다 스레드를 생성하고 시작한 다음 즉시 Join을 호출하고 완료될 때까지 기다립니다.

개별 스레드가 어떤 결과를 생성하는 경우(예: 로그에 메시지 쓰기) 스레드 간에 조정이 없기 때문에 메시지가 여전히 순서대로 표시되지 않을 수 있습니다. 모니터로 스레드를 조정하여 스레드가 결과를 순서대로 출력하도록 할 수 있습니다.

해설 (0)

스레드가 완료될 때까지 기다리는 또 다른 방법은 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();
}
해설 (0)

제가 이 글을 제대로 읽었다면, 여러 스레드에서 작업 항목을 시작하고 있는데 스레드가 순서 없이 완료되는 것이 걱정되어 각 스레드가 시작된 순서대로 완료될 때까지 기다리겠다는 뜻인가요?

이 경우 작업 항목별로 스레드를 만드는 이유를 잘 모르겠습니다. 확장할 수 있을까요?

스레드가 완료될 때까지 기다려야 한다면 그냥 그렇게 하시면 됩니다:

t.Join();
해설 (0)