2011-03-14 6 views
8

대략 다음 작업을 포함하는 작업이 있다고 가정하십시오.업무 취소를 어떻게 강제합니까?

Task someTask = new Task(() => { 

    while(!IsCancellationRequested) { 

    Do_something_over_a_long_period_of_time(); 
    token.ThrowIfCancellationRequested(); 

    Do_something_over_a_long_period_of_time(); 
    token.ThrowIfCancellationRequested(); 

    Do_something_over_a_long_period_of_time(); 
    token.ThrowIfCancellationRequested(); 
    } 
}); 
someTask.Start(); 

그리고 참을성이없는 사용자가 있습니다. 그들은 내 신청서를 즉시 종료해야합니다. 긴 행동이 진행되는 동안 기다리지 않으려 고합니다.

Thread 클래스를 사용하여 Abort() 명령을 호출하면 모든 스레드를 즉시 중단 할 수있었습니다.

작업을 즉시 중단하려면 어떻게합니까?

고맙습니다.

+1

BackgroundWorker를 보았습니까? – HadleyHope

+0

@HadleyHope 어떻게 배경 근무자가 자신의 문제를 해결할 수 있을까요? 작업과 비슷한 방식으로 취소를 지원합니다. – Kugel

답변

2

내 애플리케이션을 즉시 종료하는 데 오래 걸립니다. 긴 행동이 진행되는 동안 기다리기를 원하지 않습니다.

기본적으로 작업은 ThreadPool에서 백그라운드 작업으로 실행됩니다. 백그라운드 스레드에 신경 쓰지 않고 안전하게 응용 프로그램을 종료 할 수 있습니다.

프로세스를 종료하는 동안 아무런 문제가 없습니다.

Thread.Abort()는 빠르지 만 안전하지 않습니다. 종료 응용 프로그램조차도 아니지만 실제 문제는 거의 발생하지 않습니다.

+6

"아무런 문제가 없습니다."라고 말하고 싶지 않습니다. 만약 그 배경 스레드 중 하나가 다음 번에 응용 프로그램을 시작할 때 필요한 파일은 무엇입니까? –

+0

나는 ThreadPool과 백그라운드 작업을 잊어 버렸다. 지금은 잘 작동합니다. 고맙습니다. –

+0

@ 존 당신은 원칙적으로 맞지만 Thread.Abort()를 사용하는 데 OP가 사용됩니다 ... –

18

작업을 비협조적인 방식으로 강제로 중단 할 수 없습니다. 제어되지 않은 방식으로 스레드를 중단하면 안전하지 않으므로 의도적으로 지원되지 않습니다.

당신은 (즉, 그들에게 토큰을 전달, 너무 정기적으로 확인을) 대신 Do_something_over_a_long_period_of_time 호출을 취소 할 수 있도록해야한다.

편집 : 다른 답변에서 언급했듯이 모든 전경 스레드가 종료되었는지 확인하여 응용 프로그램 만 죽일 수 있습니다. 그러나 귀하의 업무가 반드시 을 종료 할 수있는 기회를 가지지 않았 음을 알고 있어야합니다. 파일을 쓰는 것과 같은 일을하는 경우 영구 상태가 손상되지 않도록 취소가 감지 될 때까지 기다리는 것이 좋습니다.

+0

감사합니다. 그것은 나를 위해 매우 유용합니다. –

+0

그래서 GetDataThatRunsForTheNext40secs()라는 단일 메서드를 호출하는 새 Task를 돌리면 외부에서 즉시 작업을 취소 할 수있는 방법이 없습니까? 그런 취소에 대한 결과는 중요하지 않지만 - 가능한 한 빨리 내 CPU가 유용한 일을하고 싶습니다. 생각? – Gishu

+0

@ Gishu : 문제의 협력없이 안전하게 * 할 수있는 방법을 모르겠습니다. –

관련 문제