次のメソッドをトリガーするイベントがあるとします。
public static void DoSomeWork(object obj)
{
CancellationTokenSource cts = (CancellationTokenSource)obj;
if (cts.IsCancellationRequested)
return;
Console.WriteLine("Started thread {0}.", Name);
for (int i = 0; i < 3; i++)
{
Console.WriteLine("Working on thread {0} at step {1}.", Name, i);
Thread.Sleep(10000);
if (cts.IsCancellationRequested)
{
Console.WriteLine("Canceled thread {0} at step {1}.", Name, i);
return;
}
}
Console.WriteLine("Completed thread {0}.", Name);
}
元のオブジェクトはName
文字列としての名前とCancellationTokenSource
. 私が理解したところでは、それを検知してManualResetEvent.WaitOne()
電話をかければ、キャンセルが完了するのを待つことができます。処理する新しいイベントが 1 つしかない場合、これはうまくいくようです。ただし、現在のプロセスのキャンセル中にこのイベントを複数回トリガーすると、代わりに両方のイベントが同時に実行されるようになりました。望ましい結果は、最新のイベントより前のすべてのイベントがキャンセルされ、処理が最新のイベントで実行されることです。ManualResetEvent.Set()
cts.IsCancellationRequested == true
どうすればこれを機能させることができますか?私は正しい軌道に乗っていますか?この質問への回答に役立つ追加情報があればお知らせください。