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


我正在开发一个项目,每隔30~80秒创建20~50个新任务。 每项任务都会持续10~20秒。

所以我正在使用 计时器 创建这些新任务,但每次我总是重新创建相同的任务,代码是这样的:

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); 每次?

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

我有什么指导/最佳实践可以在这种情况下使用这种线程吗?


9692
2017-09-12 20:50


起源

你正在使用 任务不是 主题。这里有所不同。 - Henk Holterman
Task.Factory.StartNew 没有“开始一个新线程”(通常) - Ian Mercer
好,我知道了。问题变为“我应该每次创建一个新任务,还是我可以重新启动它?” - Rafael Mueller


答案:


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


8
2017-09-12 20:54





修改后的问题:

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

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

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


7
2017-09-12 21:47





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


1
2017-09-12 20:56