如您所知,Thread类具有IsAlive属性。如果线程方法返回或线程被中止,则为false。所以我有这个问题:在线程中使用Timer - 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);
}
但一个任务具有定时器内。在ProtectedRun方法中,它启动计时器并返回。返回方法之后 - > Thread的IsAlive属性变为假 - > Windows服务再次启动线程 - >无限循环:)
public override void ProtectedRun()
{
_timer = new System.Timers.Timer(24 * 60 * 1000);
_timer.Elapsed += OnTimedEvent;
_timer.Enabled = true;
_timer.Start();
}
难道有人有一个想法如何处理这种情况?也许检查线程状态而不是IsAlive属性?
如果您不检查线程状态/ IsAlive,请不要让线程终止并且不要重新创建它们,在这些区域中不会有任何问题。把线程代码写成循环 - 你永远不需要为线程状态而挣扎,并且再次创建/终止。尽量专注于'真正的应用程序代码',而不是线程微管理,并且你的生活将变得如此简单:-)你真的需要一个计时器吗?睡眠(间隔)是一个更简单的方法,并且不涉及运行定时器的另一个池线程的信号/执行。 – 2012-07-06 11:45:42