2012-12-13 8 views
22

나는 다양한 작업에 대한 토큰을 가지고 더 나은 내가 사용할 수있는 취소의 통지, 자신의 취소를 관리 할 필요가? "등록 취소"할 방법이 있습니까?CancellationToken 등록 취소 조치

TaskCompletionSource로 해결 방법을 생각했습니다. 그러나 그것이 잘 작동하는지 나는 모른다. 이 방법을 해결하는 가장 좋은 방법은 무엇입니까?

+0

이 2 개 링크 중 하나는 http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/c2f614f6-c96c-4821-84cc-050b21aaee45 HTTP 도움이 될 것입니다. co.kr/questions/5299903/cancellationtokensource-cancelfalse – MethodMan

+0

도움이되지만 문제를 해결하지 못합니다. –

답변

0

정말로 등록을 실행 취소 할 방법이 없습니다.

var cancellationTokenSource = new CancellationTokenSource(); 

basicTask = Task.Factory.StartNew(() => { 
for (;;) { 
    var z = DateTime.Today.ToString(); 
} 
}, cancellationTokenSource.Token); 

var basicTask2 = Task.Factory.StartNew(() => { 
for (;;) { 
    var z = DateTime.Today.ToString(); 
} 
}, cancellationTokenSource.Token); 

//var usingThisCodeWillResultInADeadlock = cancellationTokenSource.Token.Register(() => { }); 
//usingThisCodeWillResultInADeadlock.Dispose(); 
cancellationTokenSource.Cancel(); 
basicTask.Wait(); 

교착 상태가 발생합니다 주석을 해제하십시오 처분 방법은 콜백을 제거하는 동안 토큰은 여전히 ​​등록이 있다는 정보가 포함되어 있습니다. // 유래 :

+3

당신이 보여주고 싶었던 것이 확실하지 않습니다 - 당신의'basicTask2'는 사용되지 않습니다,'basicTask'는 무한 루프를 가지고 있습니다. 그것을 취소하거나 취소하고, (정의에 의해) 끝나지 않는 작업을 기다립니다. 이 두 줄의 주석 처리를 제거해도 아무 것도 변경되지 않습니다. – greenoldman