取消令牌取消注册操作。

41

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

token.Register(RegisterMethod);

我该如何取消这个“订阅”?是否有“注销”的方式?

我考虑使用TaskCompletionSource来解决问题,但我不知道它是否会很好地工作。那么解决这个方法的最佳方式是什么?


这两个链接中的任何一个能帮到你吗? http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/c2f614f6-c96c-4821-84cc-050b21aaee45 http://stackoverflow.com/questions/5299903/cancellationtokensource-cancelfalse - MethodMan
它有所帮助,但并没有解决我的问题。 - J. Lennon
3个回答

90

2
错过了这个,谢谢。虽然如果可以直接在令牌上完成这个操作会更好。 - J. Lennon

2

-6

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

禁用评论将导致死锁。


5
我不确定您想展示什么 -- 您的“basicTask2”没有使用,而您的“basicTask”内部有一个无限循环,因此无论如何都无法停止或取消它,您等待的任务(根据定义)永远不会结束。取消对这两行的注释也没有改变任何事情。 - greenoldman
1
你一定是在开玩笑吧。你是没看清问题还是从来没有了解过CancellationToken.Register返回的内容? - quetzalcoatl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接