シナリオは次のとおりです。
実行中の Windows サービスがあります。OnStart()
関数を呼び出すタイマーを設定します(それを呼び出しましょうProcessEvent()
)。内部のコードProcessEvent
はクリティカル セクションであるため、次のことを実行できるのは 1 つのスレッドだけです。
private void ProcessEvent(object sender, ElapsedEventArgs e)
{
lock(lockObj)
{
string[] list = GetList();
Parallel.ForEach(list, item => { ProcessItem(item) });
}
}
ProcessItem
長い時間がかかる可能性があります。
サービスが停止すると、OnStop()
現在はタイマーを停止して破棄します。ただし、サービスが停止した後でも実行中のスレッドがあることに気付きましたProcessItem()
。
では、このプログラムによって生成されたすべての実行中のスレッド (主に によって生成されたものParallel.ForEach
だけでなく、 でロックを待機しているスレッドも含むProcessEvent
) をすべて強制終了するにはどうすればよいでしょうか?
自分でスレッドを作成したisBackground
場合、trueに設定でき、プロセスが終了するとすべてが強制終了されることはわかっていますが、これらのスレッドを手動で作成することはありません。