문제

스레드를 다시 시작하려고 하면 때때로 System.Threading.ThreadStateException이 발생합니다.문제의 코드는 다음과 같습니다.

// Make sure the thread is done stopping
while (this.mThread.ThreadState == ThreadState.Running)
{ 
    Thread.Sleep(0);
}
// Respawn a thread if the current one is stopped or doesn't exist
if (this.mThread == null || this.mThread.ThreadState == ThreadState.Stopped)
{ 
    this.mThread = new Thread(new ParameterizedThreadStart(Monitor)); }
// Start the thread
if (check)
{ 
    this.mThread.Start(60000); 
}
else
{   
    this.mThread.Start(0); 
}

따라서 두 가지 질문이 있습니다. 이것이 올바른 작업 방법입니까? 오류 발생을 방지할 수 있는 방법이 있습니까?

도움이 되었습니까?

해결책

문제는 새 스레드 개체를 만들어야 하는지 먼저 확인하는 코드와 스레드 개체를 시작할지 여부를 결정하는 또 다른 코드 조각이 있다는 것입니다.경쟁 조건 및 이와 유사한 이유로 인해 코드가 기존 스레드 개체에서 .Start를 호출하려고 시도하게 될 수 있습니다.뒤에 세부 정보를 게시하지 않는다는 점을 고려하면 확인하다 변수가 무엇인지 알 수 없으므로 이 동작을 촉발할 수 있습니다.

.Start가 새 개체에서만 호출되도록 코드를 재구성해야 합니다.즉, 새 스레드 개체를 생성하는 것과 동일한 if 문에 Start 메서드를 넣어야 합니다.

개인적으로는 다른 스레드를 생성할 필요가 없도록 전체 코드를 재구성하고 스레드가 계속 진행되도록 루프 내부의 스레드 개체 내부에 코드를 래핑하려고 합니다.

다른 팁

스레드가 동시에 둘 이상의 상태에 있을 수 있으므로 ThreadState 속성은 실제로 가능한 상태의 비트맵입니다.따라서 하나의 상태만으로 동등성을 테스트하면 올바른 결과를 얻을 수 없습니다.다음과 같은 작업을 수행해야 합니다.

if((mThread.ThreadState & ThreadState.Running) != 0)

그러나 스레드 상태를 확인하는 것은 잘못된 일입니다.나는 당신이 달성하려는 것이 무엇인지 완전히 명확하지 않지만 스레드를 다시 시작하기 전에 종료되기를 기다리고 있다고 추측합니다.이 경우 다음을 수행해야 합니다.

mThread.Join();
mThread = new Thread(new ParameterizedThreadStart(Monitor));
if(check)
    mThread.Start(60000);
else
    mThread.Start(0);

해결하려는 문제를 더 자세히 설명하면 더 나은 해결책이 있을 것이라고 거의 확신합니다.스레드를 다시 시작하기 위해 스레드가 끝날 때까지 기다리는 것은 나에게는 그다지 효율적이지 않은 것 같습니다.아마도 일종의 스레드 간 통신이 필요할 수도 있습니다.

남자.

시작 가능한 상태가 아닌 스레드를 시작하려고 하기 때문에 ThreadStateException이 발생합니다.가장 가능성이 높은 상황은 이미 실행 중이거나 완전히 종료된 경우입니다.

잠재적으로 몇 가지 일이 일어날 수 있습니다.첫째, 스레드가 Running에서 StopRequested로 전환되었을 수 있습니다. 이는 아직 완전히 중지되지 않았으므로 논리가 새 스레드를 생성하지 않고 방금 실행이 완료되었거나 곧 실행될 스레드를 시작하려고 합니다. 실행을 완료합니다(두 가지 모두 다시 시작하기에 유효한 상태가 아닙니다).

또 다른 가능성은 스레드가 중단되었다는 것입니다.중단된 스레드는 Stopped 상태가 아닌 Aborted 상태가 되며, 물론 재시작에도 유효하지 않습니다.

실제로 "다시 시작"할 수 있는 아직 살아 있는 유일한 종류의 스레드는 일시 중단된 스레드입니다.대신 이 조건을 사용할 수도 있습니다.

if (this.mThread == null || this.mThread.ThreadState != ThreadState.Suspended)

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