測定処理をキャンセル可能にしたい場合は、ある種のキャンセルフラグを認識させる必要があります。別の方法として、非準拠の方法でキャンセル (中止) することもできますが、リソースをクリーンアップまたは解放する機会を与えずに、重要なことの途中で処理を停止する可能性があるため、これはお勧めできません。
代わりにTask Parallel LibraryBackgroundWorker
を使用すると、コードは次のようになります。
CancellationTokenSource cts = new CancellationTokenSource();
Task tsk = Task.Factory.StartNew(() =>
{
Measurement measurement = new Measurement();
measurement.Execute(cts.Token);
},
cts.Token,
TaskCreationOptions.LongRunning,
TaskScheduler.Default);
Execute
次のようになります。
public void Execute(CancellationToken ct)
{
ct.ThrowIfCancellationRequested();
while (true)
{
// processing
// ...
// need to cancel?
ct.ThrowIfCancellationRequested();
}
}
キャンセルするには、メイン スレッドでこれを呼び出します。
cts.Cancel();
あなたは得るでしょうTaskCancelledException
が、それは期待されています。
または、例外が必要ない場合は、次のバージョンの を使用しますExecute
。これは TPL ガイドラインに厳密に従っているわけではありませんが、条件付き継続を使用しない場合は問題なく機能します。
public void Execute(CancellationToken ct)
{
if (ct.IsCancellationRequested)
return;
while (true)
{
// processing
if (ct.IsCancellationRequested)
return;
}
}