我有一个用于各种任务的令牌,我需要更好地管理它们的取消,为了得到取消通知,我可以使用:
token.Register(RegisterMethod);
我该如何取消这个“订阅”?是否有“注销”的方式?
我考虑使用TaskCompletionSource来解决问题,但我不知道它是否会很好地工作。那么解决这个方法的最佳方式是什么?
我有一个用于各种任务的令牌,我需要更好地管理它们的取消,为了得到取消通知,我可以使用:
token.Register(RegisterMethod);
我该如何取消这个“订阅”?是否有“注销”的方式?
我考虑使用TaskCompletionSource来解决问题,但我不知道它是否会很好地工作。那么解决这个方法的最佳方式是什么?
CancellationToken.Register
返回一个CancellationTokenRegistration
实例。如果您在该实例上调用Dispose
,则您的注册将被删除。
没有真正撤销注册的方法。 虽然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();
禁用评论将导致死锁。