2010-12-31 5 views
4

사람들 앞에서 제안 : 에 대해 Thread.sleep을 사용하고 있지 않습니다.을 제외하고는 해결 방법을 찾기 위해 노력하고 있습니다. 다른 사람들의 미래 코드를 처리하려고 노력하고 있습니다. 잠들지 마십시오. 나는 그것들을 동기화시키는 것이 얼마나 끔찍한 지 잘 알고있다.C#에서 수면 스레드를 깨울 수 있습니까?

내 코드 조각에 스레드를 허용합니다. 이 스레드의 수명을 제한 할 수 있기를 바랍니다. 이렇게 평소에하는 방법은 다음과 같습니다.

Thread outer = new Thread(() => 
{ 
    externalThread.Start(); 
    externalThread.Join(); 
}); 
outer.Start(); 
outer.Join(lifetime); 
if (outer.ThreadState != ThreadState.Stopped) 
{ 
    outer.Abort(); 
} 
inner.Join(); 

나는 잠자기가 끝나기 전에 수면 스레드를 깨울 수 없다는 것을 발견했습니다. 내가 .Abort을() 스레드 실행에 하드 제한되지 않습니다 실현이지만

new Thread(() => { Thread.Sleep(2000); Console.WriteLine("second"); }) 

: 나는 그것을 10 밀리 세컨드의 수명을 주면 설상가상으로, 이것은 여전히 ​​콘솔에 기록합니다. 2 초면 경고가 될 것으로 보이지만 그렇지 않은 것 같습니다 ...

WaitSleepJoin 상태 및 .Interrupt(); 그것은 스레드를 충돌 시키거나 예외를 던집니다 (미안하지만 Windows가 디버거가 실행 중이 아니라면 충돌이 발생했다는 것을 알 수 있으며 실행중인 경우에는 인터럽트가 호출되지 않은 것처럼 실행됩니다). 2 초 후 콘솔에 계속 씁니다. . .Resume()은 잠자는 스레드에 아무런 영향을주지 않습니다.

거기에 수면을 기다리는 수면을 종료하는 방법이 있습니까? Console.WriteLine이 관계없이 호출 될 수 있도록 중지하는 것이 "즉시"가 아니라는 것을 이해합니다. 그것은 나를 괴롭히는 2 초의 기다림이다. 만약 10 일간 기다려야한다면 어떨까요? 이후 들어오는 스레드를 제어 할 수 없기 때문에 나는 알 길이 없습니다. 그리고 이 그런 것을 막을 수 없습니다.

+0

다른 사용자의 스레드에 대한 참조는 어떻게합니까? –

+0

void myFunc (Thread externalThread) {// approx. 위의 코드} – Groxx

+1

10 일간 기다려야하는 경우 상사에게 해당 개발자가 해고 될 수 있도록 알려주십시오. 무능한 개발자의 가능한 모든 특수성을 다루려고 시도하지 마십시오. –

답변

2

아니요 잠에서 깨어나 실 방법이 없습니다. Abort 또는 Interrupt (둘 다 ThreadAbortException을 던짐)를 호출하여 스레드를 중단 할 수 있습니다. 실행할 때 왜 당신이 질문을 해결하기 그러나

: 스레드의 수명을 제어하기위한 코드가 당신이 원하는 것을하지 않기 때문에 10ms의 여전히 제한 시간 프린트와

new Thread(() => { Thread.Sleep(2000); Console.WriteLine("second"); }) 

, 그것은이다.

그래서 외부 스레드와 외부가 있습니다. 외부 스레드 (새 스레드를 시작하고 스레드 1로 호출 할 수 있음)를 시작하고 외부 스레드에서 외부 호출 시작 (새 스레드를 시작 함, 스레드 2로 호출)을 시작합니다. 이제 두 개의 새로운 스레드를 시작했습니다.

outer.About()을 호출하면 스레드 1 만 중단됩니다. externalThread.Start()을 호출하여 시작된 스레드 인 스레드 2는 아무 것도 수행하지 않으므로 완료까지 실행을 계속합니다.

여분의 외부 스레드로 무엇을 달성하려고하는지 잘 모르겠습니다. 이 단순하지 않을까요 :

+0

만약 내가 많은 실을 산란시키지 않으면; 나는 그들을 모두 멈추게하는 프로그래밍 방식이 필요하다. 이것과 약간의 실험을 통해 나는 "죽음"의 순간을 보냈습니다 : 중단은 전파되지 않습니다. 웬일인지, 나는 스레드가 시작된 곳에서 어떻게 든 범위가 지정된다는 것을 내 머리 속에서 알았지 만, 지금은 왜 그렇게 될 수 없는지 알 수 없습니다. 답장을 보내 주셔서 감사합니다! – Groxx

0

알 수없는 원본 스레드를 제어하려면 WaitOne + 타이머를 사용하십시오.

또는 스레드의 노동자 코드 제어가 원하는 경우 : 타이머를 좋아하지 않는 경우

좀 해키 방법, 더 "반응 잠"을 달성하기를/스레드를 해제하는 데 사용되는 다른 스레드까지

사용 그것은 모두 스레드에서 정상 Thread.sleep를

private void WaitFor(int milis) 
    { 
     const int interval = 500; 

     if (milis <= interval) 
     { 
      throw new ArgumentException(); 
     } 

     var sections = milis/interval; 
     for (var s = 0; s < sections && (!ShouldQuit); ++s) 
     { 
      Thread.Sleep(interval); 
     } 
    } 

으로 통지 ShouldQuit 플래그되는 대신에 클래스 필드에 액세스 할

를 기의

rse 이것은 이벤트/타이머 기반 대기보다 CPU 사용률 특성이 낮습니다.