11

我正在开发一个每 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); 每次?

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

关于我应该如何使用这种线程在这种情况下工作的任何指南/最佳实践?

4

3 回答 3

8

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

于 2010-09-12T20:54:27.357 回答
7

对于修改后的问题:

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

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

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

于 2010-09-12T21:47:50.110 回答
1

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

于 2010-09-12T20:56:06.797 回答