2012-12-13 14 views
22

Ho un gettone per vari compiti e ho bisogno di gestire al meglio la loro cancellazione, ricevere una notifica di cancellazione posso usare:CancellationToken UNREGISTER azione

token.Register(RegisterMethod); 

Come posso rimuovere questo "abbonamento"? C'è un modo per "UnRegister"?

Ho pensato di fare una soluzione con TaskCompletionSource. Ma non so se funzionerebbe bene. Qual è il modo migliore per risolvere questo approccio?

+0

sarà uno di questi 2 collegamenti aiuterà http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/c2f614f6-c96c-4821-84cc-050b21aaee45 http: // StackOverflow. it/questions/5299903/cancellationtokensource-cancelfalse – MethodMan

+0

aiuta ma non risolve il mio problema. –

risposta

0

Non esiste un modo per annullare davvero una registrazione. Mentre il metodo dispose rimuoverà il callback il token contiene ancora le informazioni che v'è una registrazione:

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(); 

Disabilitare i commenti che si tradurrà in una situazione di stallo.

+3

Non sono sicuro di cosa volessi mostrare - il tuo 'basicTask2' non è utilizzato, il tuo' basicTask' ha un loop infinito all'interno, quindi non importa cosa non puoi fermare o cancellalo e aspetti quel compito che (per definizione) non finisce mai. Scomporre quelle 2 linee non cambia nulla. – greenoldman