2012-09-17 3 views
2

일부 사용자 특정 코드 을 런타임에 컴파일 한 다음 AppDomain 내에서 실행하는 C# 4.0을 사용하여 WPF 응용 프로그램을 개발 중입니다. 프로세스가 10ms 또는 5 분이 걸릴 수 있습니다. AppDomain은 Task.Factory.StartNew()으로 생성됩니다. 잘 작동합니다.CancellationToken.IsCancellationRequested없이 작업을 취소하는 방법?

이제 실행을 취소/중단 할 수 있기를 원합니다. 코드가 실행되는 동안 중지 버튼을 누를 수는 있지만 어떻게 작업을 취소 할 수 있습니까? 나는 알고있다 : 거기에 CancellationToken.IsCancellationRequested 속성이지만 나는 무언가를 통해서 루프를 통과 할 수 없다. 이것은 (원자) 코드 을 실행하는 동안 값을 확인할 수없는 이유입니다. AppDomain을 언로드하면 작업이 중지되지 않습니다.

참고 : 사용하기 쉽기 때문에 작업 클래스를 가져 왔습니다. 스레드이 유용 할 경우 : 아무런 문제가 없습니다.

나를 도와 줄 사람이 있습니까? 짧은 코드가 멋지다. :)

감사합니다.

+0

컴파일 중 System.CodeDom을 사용하고 있습니까? 컴파일을 시작하기 전과 새 AppDomain을로드하고 프록시 개체를 만들기 전에 취소 할 수 있습니다. 나는 CodeDomProvider API가 컴파일 중에 취소를 허용하지 않는다고 생각한다. –

답변

0

스레드 나 작업을 중단하면 코드 이 잘못 설계된 코드이 발생합니다.

당신이 결정한다면, 모든 코드 라인이 실행될 마지막 코드 일 수 있으며 시스템을 일관성없는 상태로 남겨 둘 수있는 관리되지 않는 리소스, 잠금 등을 해제하는 것을 고려해야합니다. 이론적으로 우리는 항상이 조심해야하지만, 실제로 이것은 보유하지 않습니다. 당신이 스레드과 초대 .Abort으로하려고하면

는() 방법, 당신은 ThreadAbortException이시도 - 캐치마지막으로 블록의 관점에서 특별한 예외가 있음을 고려해야한다. 또한 스레드가 중단 될지조차 확신 할 수 없습니다.

AFAIK (저는 TPL의 전문가가 아닙니다)와 관련하여 저는 여러분이 원하는 것을 할 수 없다고 생각합니다. 어떻게 든 취소 토큰을 고려하고 계산을 완전히 멈추게 논리를 다시 설계해야합니다.

관련 문제