38

私はさまざまなタスクのトークンを持っていますが、使用できるキャンセルの通知を受け取るには、それらのキャンセルをより適切に管理する必要があります。

token.Register(RegisterMethod);

この「サブスクリプション」を削除するにはどうすればよいですか?「登録解除」する方法はありますか?

TaskCompletionSourceで回避策を実行することを考えました。しかし、それがうまくいくかどうかはわかりません。このアプローチを解決するための最良の方法は何ですか?

4

3 に答える 3

81

CancellationToken.Registerインスタンスを返しCancellationTokenRegistrationます。そのインスタンスを呼び出すとDispose、登録が削除されます。

于 2012-12-13T19:01:13.323 に答える
-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 に答える