首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Thread - IsAlive属性中使用计时器为false

在Thread - IsAlive属性中使用计时器为false
EN

Stack Overflow用户
提问于 2012-07-06 19:20:30
回答 2查看 1.9K关注 0票数 0

正如您可能知道的,Thread类具有IsAlive属性。如果线程方法返回或线程已中止,则为false。所以我对此有一个问题:

我有一个windows服务,它在不同的线程中启动多个任务。它永久检查线程的IsAlive属性,如果为false,则重新创建任务:

代码语言:javascript
复制
    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服务再次启动线程->死循环:)

代码语言:javascript
复制
    public override void ProtectedRun()
    {
        _timer = new System.Timers.Timer(24 * 60 * 1000);
        _timer.Elapsed += OnTimedEvent;
        _timer.Enabled = true;
        _timer.Start();
    }

有没有人知道如何处理这种情况?也许可以检查线程状态而不是IsAlive属性?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-06 19:25:10

好吧,你有一个坏掉的设计,就像这样。

  1. 您可以在线程中运行任务,并在它们不再活动时重新启动它们。GOod。
  2. 你有一个特定的任务立即结束,但在计时器上排队更多的工作。很好,

然而,坏消息是,第一个前提下的一个任务和测试根本不兼容。

选择:

在启动timer.

  • Rework后,
  • 修改重新启动逻辑或
  • 使线程保持活动状态,以便有特定的任务级别(而不是线程级别)状态字段可供遵循。

最后,您的one ProtectedRun方法在将活动工作排队时(通过计时器)返回时,没有遵循它应该遵循的规范。

票数 3
EN

Stack Overflow用户

发布于 2012-07-06 19:32:13

实际发生的情况是,您的线程(具有计时器的那个线程)实际上成功退出。这就是为什么IsAlive是假的。

在您创建的线程中不会执行在计时器处理程序中执行的代码。

请参见以下示例:

代码语言:javascript
复制
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();
    }
}

结果:

代码语言:javascript
复制
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

您必须重新考虑应用程序的设计。你确定你需要启动一个首先产生计时器的线程吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11361213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档