38

我有一个用于各种任务的令牌,我需要更好地管理它们的取消,以便收到我可以使用的取消通知:

token.Register(RegisterMethod);

如何删除此“订阅”?有没有办法“取消注册”?

我想过用 TaskCompletionSource 做一个解决方法。但我不知道它是否会运作良好。解决这种方法的最佳方法是什么?

4

3 回答 3

81

CancellationToken.Register返回一个CancellationTokenRegistration实例。如果您调用Dispose该实例,您的注册将被删除。

于 2012-12-13T19:01:13.323 回答
1

您可以安全地处置整个 CancellationTokenSource。无需担心取消注册回调。

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

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

于 2021-01-29T16:03:31.583 回答
-5

没有办法真正撤消注册。虽然 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();

禁用评论将导致死锁。

于 2016-03-23T15:48:52.120 回答