2010-08-22 4 views
11

서버에서 레코드를 얻기위한 실행 스레드가있는 단독 개체가 있습니다. 그러나 내 winform 응용 프로그램을 중지하면 스레드가 계속 실행됩니다. 내 싱글 톤에서 소멸자를 만들어 스레드를 중단하려고 시도했지만, 스레드에 아무런 영향을 미치지 않습니다. 소멸자가 발생했다는 것을 알고 있습니다.내 winform 응용 프로그램이 닫힐 때 스레드를 중지하는 방법

내 응용 프로그램을 닫을 때 스레드를 종료하는 방법에 대한 제안을 찾고 있습니다. 감사

C#을

, .net2

+0

가능한 중복 [? 폼의 closing 이벤트에 BackgroundWorker에 중지하는 방법 (http://stackoverflow.com/questions/1731384/how-to-stop- backgroundworker-on-forms-closing-event) –

+0

나는 당신의 링크 sugestion을 보았다 ... 나를 위해 일을하지 않았다. – fishhead

답변

9

최선의 선택, 응용 프로그램에서 가능하면 협력을 취소 할 수 있습니다.

실행할 코드가 더 이상 없을 때 스레드가 자동으로 멈 춥니 다. 따라서 사용자가 응용 프로그램을 닫으면 스레드를 중지해야 함을 나타내는 플래그를 설정합니다. 스레드가 플래그가 설정되어 있으면 때때로 확인해야하며, 그렇다면 서버에서 레코드를 가져 오는 것을 중지하고 돌아 오십시오.

그렇지 않으면, 당신은 스레드가 될 수있다 예를

static bool isCancellationRequested = false; 
static object gate = new object(); 

// request cancellation 
lock (gate) 
{ 
    isCancellationRequested = true; 
} 

// thread 
for (int i = 0; i < 100000; i++) 
{ 
    // simulating work 
    Thread.SpinWait(5000000); 

    lock (gate) 
    { 
     if (isCancellationRequested) 
     { 
      // perform cleanup if necessary 
      //... 
      // terminate the operation 
      break; 
     } 
    } 
} 
54

에 대한 자신의 솔루션을 롤백 할 수 있습니다 :

  • 전경을 :이 마무리 될 때까지 살아 프로그램을 유지합니다.
  • 배경 : 응용 프로그램을 닫으면 종료됩니다.

스레드를 만들 때 기본적으로 전경 스레드입니다.

당신은 이런 것을 변경할 수 있습니다

:

Thread t = new Thread(myAction); 
t.IsBackground = true; 
t.Start();
+0

폼이 닫힐 때 백그라운드 스레드가 끝나나요? 예를 들어, 여러 개의 양식이 있고 하나의 양식에 스레드가 있다고 가정 해보십시오. 양식이 닫히면 스레드가 무한 루프에 있어도 스레드가 종료됩니까? 또는 응용 프로그램이 종료 될 때 스레드가 종료됩니까 (주 처리가 완료 될 때)? – JT9

+0

@ JT9 다중 폼 응용 프로그램에서 양식을 닫을 때 배경 스레드가 끝나지 않았습니다. – tunafish24

관련 문제