2012-12-13 20 views
22

私は、さまざまなタスクのためのトークンを持っていると私はより良い私が使用することができますキャンセルが通知されるように、彼らの取り消しを管理する必要がありますか? 「登録を解除する」方法はありますか?CancellationToken登録解除アクション

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

+0

は、これらの2つのリンクのいずれかは、あなた http://social.msdn.microsoft.com/Forums/en-US/parallelextensions/thread/c2f614f6-c96c-4821-84cc-050b21aaee45 のhttp役立ちます。 com/questions/5299903/cancellationtokensource-cancelfalse – MethodMan

+0

私の問題を解決することはできますが、解決しません。 –

答えて

45

CancellationToken.Registerは、CancellationTokenRegistrationインスタンスを返します。そのインスタンスでDisposeに電話すると、登録が削除されます。

+0

これを逃していた、ありがとう。これはトークンで直接行うことができればいいですが。 –

0

実際に登録を元に戻す方法はありません。

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(); 

デッドロックになりますコメントを無効にする:Disposeメソッドがコールバックを削除しますが は、トークンがまだ登録があるという情報が含まれています。 // stackoverflowの:

+3

私はあなたが見せたいのか分かりません - あなたの 'basicTask2'は未使用です、あなたの' basicTask'は無限のループを持っています。それを取り消すか、それを取り消し、あなたは(定義によって)決して終わらないその仕事を待つ。これらの2行のコメントを外しても何も変わりません。 – greenoldman

関連する問題