正如您可能知道的,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);
}但是其中一个任务里面有计时器。在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属性?
发布于 2012-07-06 19:25:10
好吧,你有一个坏掉的设计,就像这样。
然而,坏消息是,第一个前提下的一个任务和测试根本不兼容。
选择:
在启动timer.
最后,您的one ProtectedRun方法在将活动工作排队时(通过计时器)返回时,没有遵循它应该遵循的规范。
发布于 2012-07-06 19:32:13
实际发生的情况是,您的线程(具有计时器的那个线程)实际上成功退出。这就是为什么IsAlive是假的。
在您创建的线程中不会执行在计时器处理程序中执行的代码。
请参见以下示例:
internal class Program
{
private static void Main(string[] args)
{
Thread z = new Thread(new ParameterizedThreadStart(Test)) { Name = "My new thread !" };
z.Start();
Console.ReadKey();
}
private static void Test(object obj)
{
Console.WriteLine(string.Format("My name is: {0}, my ID is: {1}", Thread.CurrentThread.Name, Thread.CurrentThread.ManagedThreadId));
var _timer = new System.Timers.Timer(1000);
_timer.Elapsed += (sender, e) =>
{
Console.WriteLine(string.Format("[Timer] My name is: {0}, my ID is: {1}", Thread.CurrentThread.Name, Thread.CurrentThread.ManagedThreadId));
};
_timer.Enabled = true;
_timer.Start();
}
}结果:
My name is: My new thread !, my ID is: 10
[Timer] My name is: , my ID is: 12
[Timer] My name is: , my ID is: 12
[Timer] My name is: , my ID is: 12您必须重新考虑应用程序的设计。你确定你需要启动一个首先产生计时器的线程吗?
https://stackoverflow.com/questions/11361213
复制相似问题