私はさまざまなタスクのトークンを持っていますが、使用できるキャンセルの通知を受け取るには、それらのキャンセルをより適切に管理する必要があります。
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();
コメントを無効にすると、デッドロックが発生します。