我有各种任务的令牌,我需要更好地管理他们的取消,以获得我可以使用的取消通知:
token.Register(RegisterMethod);
如何删除此“订阅”? 有没有办法“UnRegister”?
我考虑过使用TaskCompletionSource进行解决方法。但我不知道它是否会运作良好。解决这种方法的最佳方法是什么?
答案 0 :(得分:51)
CancellationToken.Register
会返回CancellationTokenRegistration
个实例。如果您在该实例上致电Dispose
,您的注册将被删除。
答案 1 :(得分:1)
您可以安全地处理整个 CancellationTokenSource。不用担心取消注册回调。
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();
禁用评论将导致死锁。