ロードと呼ばれるUIボタンがあります。スレッドはスレッドを生成し、スレッドを生成します。タスクの待機があり、終了するとタスクはキャンセルされます。ロードボタンは無効になっておらず、ユーザーは複数回クリックできます。クリックするたびに前のタスクをキャンセルする必要があります。CancellationTokenとCancellationTokenSource-どのように使用するのですか?
私はCancellationTokenSourceとCancellationTokenをどのように使うべきか混乱しています。 Beowはコードです。あなたはそれをどのように使用するか、以下の使用法に問題があるかどうかを教えてください。非同期ではありません。私たちはまだそこにいません。
CancellationTokenSource _source = new CancellationTokenSource();
public void OnLoad()
{
//Does this cancel the previously spawned task?
_source.Cancel();
_source.Dispose();
_source = new CancellationTokenSource();
var activeToken = _source.Token;
//Do I need to do the above all the time or is there an efficient way?
Task.Factory.StartNew(() =>
{
var child = Task.Factory.StartNew(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(20));
activeToken.ThrowIfCancellationRequested();
}, activeToken);
if (!child.Wait(TimeSpan.FromSeconds(5)))
{
_source.Cancel();
}
});
}
注は、私が以前に生成されたタスクをキャンセルする必要があり、すべての生成されたタスクはタイムアウトを持っている必要があります。
を私は後にトークンをキャンセルする方法で構築されたあると思う程度理由により簡単に何が起こっているか確認する必要があり最初の3つのことを修正
一定のタイムアウト。 – CodesInChaos
http://stackoverflow.com/a/16607800/34397 – SLaks
@ SLaks - それは私が.NET 4.0上で動作しません – Mike