您可能知道 Thread 类具有 IsAlive 属性。如果线程方法返回或线程被中止,则为 false。所以我有一个问题:
我有一个 Windows 服务,它在不同的线程中启动多个任务。它永久检查线程的 IsAlive 属性,如果它为假,则重新创建一个任务:
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);
}
但是其中一项任务里面有 Timer。在 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 属性?