代码之家  ›  专栏  ›  技术社区  ›  Rafael Mueller

重新启动任务还是创建新任务?

  •  11
  • Rafael Mueller  · 技术社区  · 14 年前

    我在做一个项目,每30~80秒创建20~50个新任务。 每个任务持续10~20秒。

    Timer 创建这些新任务,但每次我总是重新创建相同的任务时,代码如下所示:

    public class TaskRunner : IDisposable
    {
        private readonly Timer timer;
        public IService service;
    
        public ThreadRunner(IService service) {
                this.service = service;
                timer = new Timer(10000);
                timer.Elapsed += Execute;
                timer.Enabled = true;
            }
        }
    
        private void Execute(object sender, ElapsedEventArgs e)
        {
            try
            {
                Task.Factory.StartNew(service.Execute);
            }
            catch (Exception ex)
            {
                logger.ErrorFormat("Erro running thread {0}. {1}", service, ex);
            }
        }
    
        public void Dispose()
        {
            timer.Dispose();
        }
    }
    

    我的问题是,有任何方法可以创建一个任务并不断重新启动它,所以我不需要开始一个新的任务 任务.Factory.StartNew(服务。执行);

    或者这是我不必担心的事情,继续创建新任务也没关系?

    关于如何使用这种线程处理这种场景,有什么指南/最佳实践吗?

    3 回复  |  直到 12 年前
        1
  •  8
  •   Hans Passant    12 年前

    Execute方法已在线程上运行。由启动的线程池线程系统计时器计时器您正在使用以引发已用事件。不要开始另一个线程,只是使用一个交给你。线程池线程非常便宜,可以自动回收。

        2
  •  7
  •   Henk Holterman    13 年前

    对修改后的问题:

    我应该每次都创建一个新任务,还是重新启动它?

    答案应该非常清楚:是的,每次都用一个新的。不要试图以任何方式重复使用任务,越短越好。

    虽然创建线程非常昂贵,但任务已经在使用threadpool来解决这个问题。别干涉,你只会带来麻烦。

        3
  •  1
  •   Anthony Williams    14 年前

    与其在计时器触发时重新启动每个线程,为什么不让每个线程运行一个以所需频率运行指定代码的循环?