【问题标题】:Restart a task or create a new one?重新启动任务还是创建新任务?
【发布时间】:2010-09-12 20:50:47
【问题描述】:

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

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

关于我应该如何使用这种线程处理这种情况,有任何指南/最佳实践吗?

【问题讨论】:

  • 您使用的是Tasks,而不是Threads。在这里与众不同。
  • Task.Factory.StartNew 不会“启动新线程”(通常)
  • 好的,我知道了。问题变为“我应该每次都创建一个新任务,还是可以重新启动它?”

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    对修改后的问题:

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-10-18
        • 2013-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多