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

时间:2010-09-12 20:50:48

标签: c# multithreading c#-4.0 task-parallel-library

我正在开发一个每隔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();
    }
}

我的问题是,无论如何创建任务并继续重新启动它,所以我不需要每次都启动一个新任务 Task.Factory.StartNew(service.Execute);

或者那是我不必担心的事情,可以继续创建新任务吗?

关于我应该如何处理这种情况的任何指南/最佳实践,以及那种线程?

3 个答案:

答案 0 :(得分:8)

您的Execute方法已在线程上运行。由您正在使用的System.Timers.Timer启动的线程池线程,以便引发Elapsed事件。不要启动另一个线程,只需使用交给你的线程。 Threadpool线程非常便宜并且可以自动回收。

答案 1 :(得分:7)

修改后的问题:

  

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

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

虽然创建线程非常昂贵,但是任务已经在使用ThreadPoool来解决这个问题。不要干涉它,你只会引入问题。

答案 2 :(得分:1)

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