これに対する私のアプローチは、ブール値フラグを使用して、操作が一時停止されているかどうかを知らせることです (おそらく、操作がキャンセルされているかどうかを知らせる 2 つ目のフラグ)。ユーザーが一時停止ボタンを押したときにIsPaused
フラグを true に設定して、ワーカーが次のアイテムの処理を開始したときにこのフラグをチェックし、待機状態になることを認識できるようにします。
BackgroundWorker をこの一時停止状態に保つ方法はいくつかあります。私のアプローチは、ManualResetEvent を使用することです。これにより、BackgroundWorker スレッドはスリープ状態に入り、イベントが設定されると終了します。これは、スレッドがまだスリープ状態にある必要があるかどうかを確認するためにウェイクアップするのではなく、イベントが設定されるまでスレッドがスリープ状態のままであるため、スリープ本体で while ループを使用するよりも優れていると思います。ユーザーが続行したい場合は、このイベントを設定して、バックグラウンド ワーカーを続行させることができます。
したがって、コードは次のようになります。
private void backgroundWorker_doWork(object sender, DoWorkEventArgs args)
{
//Initialize any pre-work stuff here.
while(!finished)
{
if (Paused)
m_evtPause.WaitOne();
if (Cancelled)
break;
//lengthy thread procedure code.
}
}