我正在开发一个每隔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); ?
或者那是我不必担心的事情,可以继续创建新任务吗?
关于我应该如何处理这种情况的任何指南/最佳实践,以及那种线程?
答案 0 :(得分:8)
您的Execute方法已在线程上运行。由您正在使用的System.Timers.Timer启动的线程池线程,以便引发Elapsed事件。不要启动另一个线程,只需使用交给你的线程。 Threadpool线程非常便宜并且可以自动回收。
答案 1 :(得分:7)
修改后的问题:
我应该每次创建一个新任务,还是可以重新启动它?
答案应该非常清楚:是的,每次都要使用新的。不要以任何方式尝试重复使用任务,使用越短越好。
虽然创建线程非常昂贵,但是任务已经在使用ThreadPoool来解决这个问题。不要干涉它,你只会引入问题。
答案 2 :(得分:1)
为什么不让每个线程运行一个以所需频率运行指定代码的循环,而不是在定时器触发时重新启动每个线程?