2013-01-05 6 views
0

중단 할 스레드가 있습니다. 제가 한 것은 다음과 같습니다. 내 스레드 중지

randomImages = new Thread(new ThreadStart(this.chooseRandomImage)); 
      randomImages.Start(); 

은 단순히 false로 threadAlive을 설정 정지 스레드 버튼을 클릭시 스레드 이제

bool threadAlive = true; 
public void chooseRandomImage() 
    { 
     while(threadAlive) 
     { 
      try 
      { 
       //do stuff 


      } 

      catch (Exception exe) 
      { 
       MessageBox.Show(exe.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 


     } 
    } 

에서 호출하는 방법입니다. 문제는 스레드가 기세의 형태를 모으는 것처럼 즉시 멈추지 않습니다. 어떻게하면 즉시 스레드를 멈추고 다시 시작할 수 있습니까?

private void butStopThread_Click(object sender, EventArgs e) 
    { 

     threadAlive = false; 


     if(threadAlive == false) 
     { 
      //do stuff 
     } 


    } 
+0

이 질문 [스레드로 완료하는 방법을 기다리는 방법?] (http : // stackoverflow.com/questions/1584062/how-to-wait-for-thread-to-finish-with-net) – Steve

+1

@ 스티브 저는 이탈리아어를 모르는 대부분의 사람들이 elencated *의 의미에 익숙하지 않다는 것을 확신합니다. 그냥 선생님. –

+0

네, 나열된 목록에 .... 오, 이런 ... 나는 뇌에 약간의 설탕이 필요해. 점심 시간은 – Steve

답변

2

미안 해요, 즉 그것을 할 수있는 최선의 방법입니다하지 않는 것이 좋습니다. 위로 .NET 4.0을 사용하면 스레드가 아닌 작업을 사용해야하며, CancellationToken이라고하는이 작업이 변수와 거의 동일합니다.

그런 다음 취소 후 처리가 완료 될 때까지 기다립니다. 문제가 빨리 발생해야하는 경우 취소 확인이보다 세분화되어 더 자주 확인됩니다.

스레드 중단은 http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation에 설명 된 바와 같이 상당한 부작용이있을 수 있으므로 일반적으로이 방법을 사용하면 안됩니다.

아니요, 중지 된 스레드 등을 마술처럼 다시 시작할 수 없습니다. 다시 시작점, 저장 지점, 장기 실행 트랜잭션을 단계별로 저장하고 완료된 위치를 기억해야합니다.

사이드 노트로서 - 작업을 사용하지 말고 .NET의 최신 버전에 액세스 할 수있는 경우 인터럽트 된 액세스 클래스 메서드를 사용하면 휘발성이 필요하지 않습니다. 이전에는 스레드 안전성이있는 어셈블러 명령어 정의 당.

1

이 이 중단 호출하여 다른 스레드에서 스레드를 종료 할 수 있지만,이 경우 무리하게이 작업을 완료 여부에 대한 걱정없이 영향을받는 스레드를 종료하고 대한 더 기회를 제공하지 않습니다 자원 정리. 이 예제에 표시된 기술이 좋습니다.

당신은 Abort method를 사용할 필요하지만

+1

-1입니다. 와우. 다른 것. 보시다시피, 최신 버전에서는 "사용하지 마십시오"라는 표시가있는 이유가 있습니다. 설명을 보려면 http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation을 확인하십시오. 이것은 절대로 부르지 않아야하는 방법입니다. 심각한 부작용이있을 수 있습니다. – TomTom

0

제공된 정보에서 worker 스레드와 UI 스레드 모두에서 변수 이 액세스되고있는 것으로 보입니다 (). 동기화 문제없이 크로스 스레드 액세스가 발생하는지 확인하는 volatile 키워드를 사용하여 threadAlive를 선언하십시오.

volatile bool threadAlive; 

스레드를 다시 시작하려면 먼저 모든 필요한 정리 작업을 수행해야합니다. 메인/UI 스레드의 스레드 개체에 Join 메서드 호출을 사용하여 스레드가 안전하게 종료되는지 확인하십시오. 다시 시작하려면 스레드에서 Start 메서드를 호출하기 만하면됩니다.

randomImages.Join(); 
+0

그는 이미 휘발성이 있습니다 (자신의 게시물에서 읽을 수있는 것처럼). 그는 단순히 실을 끝내기를 원하지 않습니다. – TomTom

+0

음 원래 게시물에서 volatile 키워드를 사용하여 선언 된 threadAlive 변수를 볼 수 없습니다. 당신이 지적 해 주시겠습니까? :) 또한 그는 스레드가 즉시 멈추길 원합니다. 그런 다음 다시 시작하십시오. 내 대답은 그렇게 할 수 있습니다. – prthrokz

+0

Ups. 그것을 간과했다. 예. 죄송합니다. 내 사과. 그러나 기술적으로는 휘발성이 있으면 안됩니다. 연동 액세스를 사용할 수 있습니다. – TomTom