CancellationToken UnRegister Action

时间:2012-12-13 16:46:33

标签: c# task async-await async-ctp cancellation-token

我有各种任务的令牌,我需要更好地管理他们的取消,以获得我可以使用的取消通知:

token.Register(RegisterMethod);

如何删除此“订阅”? 有没有办法“UnRegister”?

我考虑过使用TaskCompletionSource进行解决方法。但我不知道它是否会运作良好。解决这种方法的最佳方法是什么?

3 个答案:

答案 0 :(得分:51)

CancellationToken.Register会返回CancellationTokenRegistration个实例。如果您在该实例上致电Dispose,您的注册将被删除。

答案 1 :(得分:1)

您可以安全地处理整个 CancellationTokenSource。不用担心取消注册回调。

代码: https://github.com/microsoft/referencesource/blob/master/mscorlib/system/threading/CancellationTokenSource.cs#L552

CancellationTokenSource 的 Dispose() 方法将对您通过 Token.Register(callBack) 添加到令牌的每个注册回调调用 dispose。

答案 2 :(得分:-2)

无法真正撤消注册。 虽然dispose方法将删除回调,但令牌仍包含有注册的信息:

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

禁用评论将导致死锁。

相关问题