2012-10-15 3 views
0

내 스레드 데모 용 Windows Form 응용 프로그램을 사용하고 있습니다. button1을 클릭하면 스레드가 시작되고 재귀 적으로 작업이 시작됩니다.Windows Form 응용 프로그램, 스레드가 중지되지 않습니다.

여기 예상대로 양식이 멈추지 않습니다. Button2를 클릭하면 현재 실행중인 스레드를 중지하고 싶습니다. 그러나 이것은 작동하지 않습니다.

 private void button1_Click(object sender, EventArgs e) 
     { 
      t = new Thread(doWork);   // Kick off a new thread 
      t.Start();    
     } 

     private void button2_Click(object sender, EventArgs e) 
     {     
      t.Abort(); 
     }  

     static void doWork() 
     {  
      while (true) 
      { 
       //My work  
      } 
     } 
     } 

디버깅 할 때 button2_Click 메서드는 포인터를 누르지 않습니다. 스레드는 계속 바쁘기 때문에 생각합니다.

어딘가 잘못되면 저를 시정하십시오.

+0

는 "작동하지 않습니다"를 정의 - 정확히 무엇을 어떻게하고 무슨 일이 기대? – Justin

+0

죄송합니다. 정의로 게시물을 편집합니다. Tx 주석. :) – devan

+0

@devan : 어떤 포인터? – dotNETbeginner

답변

6

이렇게 스레드를 죽일 수 없습니다. 그 이유는 스레드에서 잠금을 추가 한 다음 잠금이 해제되기 전에 종료하는 상황을 피하기 위해서입니다.

전역 변수를 만들고이를 사용하여 스레드를 제어 할 수 있습니다.

간단한 샘플 :

private volatile bool m_StopThread; 

private void button1_Click(object sender, EventArgs e) 
{ 
    t = new Thread(doWork);   // Kick off a new thread 
    t.Start();    
} 

private void button2_Click(object sender, EventArgs e) 
{     
    m_StopThread = true; 
}  

static void doWork() 
{  
    while (!m_StopThread) 
    { 
      //My work  
    } 
} 
+0

은 스레드를 죽이는 것이 좋지 않을 수 있지만, 메소드가 너무 길고 어떤 루핑 구조에도 의존하지 않는 경우 전역 변수를 확인하는 것이 실용적이지 않습니다. – dotNETbeginner

+0

감사합니다 당신은 답장을드립니다. 하지만이 방법은 button2_click 메서드가 executer에 의해 적용되지 않기 때문에 유용하지 않습니다. 나는 이것이 다른 무엇인가 문제라고 생각한다. – devan

+0

@devan Button1은 button2를 클릭 할 때 새 스레드를 시작합니다. 변수를 다른 스레드에서도 볼 수있는 것으로 지정합니다. 여기서 뭐가 문제 야? – Leri

관련 문제