System.Timers.Timer创建活动线程

时间:2017-12-14 19:06:18

标签: c# multithreading timer threadpool

我正在使用System.Timers.Timer来处理作业。 示例代码如下。

 private static Timer timer = null;
  timer = new Timer(INTERVAL_MIN * 1000 * 60);
  timer.Elapsed += timer_Elapsed;
  timer.start();

 private static void timer_Elapsed(object sender, ElapsedEventArgs e)
 {
     Work();
 }

运行这份工作几个小时后。 我收到了这个错误

  

“ThreadPool中没有足够的空闲线程来完成操作。”

这个计时器线程在使用后是否没有被处置?我们需要照顾它吗?

1 个答案:

答案 0 :(得分:2)

ThreadPool主要用于简短操作,即非常小的任务,所以如果你使用system.Timer,那么它会使用线程池的线程。这就是造成问题的原因。

因为如果你使用Work()方法,那么就会出现像访问文件,网站/网络服务或数据库那样长时间操作的问题。

所以解决方法是尽快释放线程池线程。为此你可以这样做

 private static void timer_Elapsed(object sender, ElapsedEventArgs e)
 {
      //by doing below it will release thread pool thread and cosume thread where long running option can be performed 
      new Thread (Work).Start();
    //or try with TPL like this 
    Task.Factory.StartNew(() => 
        {
           Work();
        }, 
            TaskCreationOptions.LongRunning
        );
 }