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

StackOverflow https://stackoverflow.com/questions/6890

문제

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

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

루프 내에서 이것을 호출하면 항목이 완전히 순서가 바뀌게 됩니다.대기 시간을 어떻게 도입하나요? t.Start(), 코드가 계속되기 전에 스레드 작업이 완료되도록 하시겠습니까?BeginInvoke/EndInvoke가 스레드를 수동으로 생성하는 것보다 더 나은 옵션입니까?

도움이 되었습니까?

해결책

스레드에 얼마나 많은 순서를 적용해야 합니까?코드가 계속되기 전에 루프에서 시작된 모든 작업을 완료해야 하지만 루프 내 작업이 완료되는 순서에 관심이 없다면 Join을 호출하는 것이 답입니다.자세한 내용을 추가하려면 케빈 케니의 대답은, Join에 전화해야 해 밖의 루프.즉, 시작한 스레드에 대한 참조를 보관하려면 컬렉션이 필요합니다.

// 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();
}

반대로 루프 내에서 Join을 호출하면 결과는 기본적으로 스레드를 전혀 사용하지 않는 것과 같습니다.루프 본문의 각 반복은 스레드를 생성하고 시작하지만 즉시 스레드에 참여하고 완료될 때까지 기다립니다.

개별 스레드가 어떤 결과를 생성하는 경우(예: 로그에 메시지 작성) 스레드 간에 조정이 없기 때문에 메시지가 여전히 순서 없이 나타날 수 있습니다.스레드를 모니터와 조정하여 결과를 순서대로 출력하도록 하는 것이 가능합니다.

다른 팁

스레드가 완료되기를 기다리는 또 다른 방법은 다음을 사용하는 것입니다. 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();
}

내가 이 글을 제대로 읽고 있다면, 여러분은 여러 스레드에서 작업 항목을 시작하고 있지만 스레드가 순서 없이 완료되는 것을 걱정하고 각 스레드가 시작된 순서대로 완료될 때까지 기다리는 것을 선호하시겠습니까?

그렇다면 왜 작업 항목별로 스레드를 생성하는지 잘 모르겠습니다.어쩌면 확장할 수도 있지 않을까요?

스레드가 완료될 때까지 기다려야 하는 경우 다음을 수행할 수 있습니다.

t.Join();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top