我正在使用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中没有足够的空闲线程来完成操作。”
这个计时器线程在使用后是否没有被处置?我们需要照顾它吗?
答案 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
);
}