ご存知かもしれませんが、Thread クラスには IsAlive プロパティがあります。スレッド メソッドが返された場合、またはスレッドが中止された場合は false です。だから私はこれに問題があります:
異なるスレッドでいくつかのタスクを開始する Windows サービスがあります。スレッドの IsAlive プロパティを永続的にチェックし、false の場合はタスクを再作成します。
foreach (var worker in _workers)
_threads.Add(new Thread(worker.ProtectedRun));
foreach (var thread in _threads)
thread.Start();
while (!EventWaitHandle.WaitOne(0))
{
for (var i = 0; i < _threads.Count; i++)
{
if (!_threads[i].IsAlive)
{
_threads[i] = new Thread(_workers[i].ProtectedRun);
_threads[i].Start();
}
}
EventWaitHandle.WaitOne(1000);
}
しかし、タスクの 1 つにタイマーが含まれています。ProtectedRun メソッドでは、タイマーを開始して戻ります。メソッドが返された後 -> スレッドの IsAlive プロパティが false になる -> Windows サービスがスレッドを再度開始する -> 無限ループ :)
public override void ProtectedRun()
{
_timer = new System.Timers.Timer(24 * 60 * 1000);
_timer.Elapsed += OnTimedEvent;
_timer.Enabled = true;
_timer.Start();
}
誰かがこの状況を処理する方法を知っていますか? IsAlive プロパティの代わりにスレッドのステータスを確認してください。