2010-03-05 3 views
3

20 개의 스레드를 사용하는 응용 프로그램이 있습니다. 메일을 보낼 스레드를 사용하는 이메일 클라이언트입니다.스레드 취소 중

현재 스레드는 주 스레드에서 생성됩니다. 하지만 내가 전체 작업을 취소하려면 어떻게해야할까요? 내가 그것을 할 수있는 유일한 방법은 메인 스레드를 죽이는 것입니다 ... 따라서 프로그램을 종료.

나는 캡슐 스레드를 죽일 수 있도록 메일 링에 대한 스레드를 캡슐화하는 스레드를 만들어야 할 것인가?

현재 BackgroundWorker를 사용하고 있으며 WF 응용 프로그램입니다.

+0

당신이 20 개 BackgroundWorker 구성 스레드 또는 다른 스레드를 미사일에 – rerun

답변

3

당신이 BackgroundWorker를 사용하는 경우에 당신은 이미 당신이 작업을 취소하는 데 필요한 모든 인프라를 가지고있다. BackgroundWorker에서 WorkerSupportsCancellationtrue으로 설정하고 취소하려는 경우 작업자의 CancelAsync 메소드를 호출하십시오.

분명히 취소를 기리기 위해 작업자 코드를 작성해야합니다. BackgroundWorkerCancellationPending 속성을 확인하면됩니다.

MSDN에는이 속성을 사용하는 example이 있습니다.


주 - I 오전 BackgroundWorker 20 스레드의 조합에 의해 혼란 비트; BackgroundWorker은 하나의 스레드 만 사용합니다. 20 BackgroundWorkers에서 돌고 있습니까? 그렇다면 어떻게 적절히 처리되는지 확인하십시오. Winforms 응용 프로그램에서 그렇게 많은 동시성이 필요한 경우 비동기 대리자 또는 스레드 풀을 사용하는 것이 좋습니다.

당신이 실제 스레드를 작성하는 경우, 취소 플래그를 구현하는 하나의 공통 방법은 ManualResetEvent를 사용하는 것입니다. 이 이벤트가 제로의 타임 아웃으로 기다리는 경우는 thread-safe 상태 플래그로서 기능합니다. 사용 예는 다음과 같습니다 당신이 cancelEvent.Set()를 작성하는 경우는 상태 확인 안타

ManualResetEvent cancelEvent = new ManualResetEvent(false); 
for (int i = 0; i < 20; i++) 
{ 
    ThreadPool.QueueUserWorkItem(s => 
    { 
     // Do some work 
     if (cancelEvent.WaitOne(0, true)) 
      return; 
     // Do some more work 
     // etc. 
    }); 
} 

그런 다음 어떤 시점에서 이후, 모든 근로자가 즉시 작업을 중지합니다.

+0

예하지만 실 거예요 그건 그냥 현재 스레드를 취소를 사용하고 계십니까? 각 스레드는 회사 데이터베이스에서 선택한 전자 메일 세트를 전자 메일로 보내도록 설정됩니다. 그래서 내가 그 스레드를 취소한다면, 다른 19 개는 여전히 살아있을 것입니다. –

+0

아, 죄송합니다. 회신의 마지막 부분을 읽으십시오. –

관련 문제