【发布时间】:2013-01-27 03:06:05
【问题描述】:
使用 .NET 4.0 运行时编译和运行,我有这样的代码:
int MinWorkerThreads, MaxWorkerThreads;
int MinCompletionPortThreads, MaxCompletionPortThreads;
ThreadPool.GetMinThreads(out MinWorkerThreads, out MinCompletionPortThreads);
ThreadPool.GetMaxThreads(out MaxWorkerThreads, out MaxCompletionPortThreads);
_logger.Info("Default thread pool settings min/max:");
_logger.Info("Worker thread: " + MinWorkerThreads + " / " + MaxWorkerThreads);
_logger.Info("IO thread : " + MinCompletionPortThreads + " / " + MaxCompletionPortThreads);
_logger.Info("Setting minimum default worker thread count to " + Config.MinWorkerThreads);
if (!ThreadPool.SetMinThreads(Config.MinWorkerThreads, MinCompletionPortThreads))
{
_logger.Warn("Unable to modify the minimum number of worker threads");
}
ThreadPool.GetMinThreads(out MinWorkerThreads, out MinCompletionPortThreads);
_logger.Info("Worker thread: " + MinWorkerThreads + " / " + MaxWorkerThreads);
我的日志输出如下所示:
Default thread pool settings min/max:
Worker thread: 4 / 32767
IO thread : 4 / 1000
Setting minimum default worker thread count to 50
Worker thread: 50 / 32767
值会立即更改,但不会永久更改。
我为什么要这样做? Timers 使用默认的 ThreadPool,我曾见过突然一批任务进入系统线程池,淹没它,导致一些应该每 15 秒触发一次的计时器延迟超过 60 秒。
问题是,当我将相同的信息转储到运行时十五分钟时,使用相同的代码,我得到的值非常不同:
Worker thread: 4 / 400
IO thread : 4 / 400
有没有更好的方法来解决这个问题而不放弃使用System.Timers.Timer?什么会在完全不涉及 IIS 的独立 C# 应用程序中重置此值?如果你是自托管 ASP.NET,那会隐式改变系统线程池的调优吗?
【问题讨论】:
-
This is about 3.5 但可能相关...
-
我确实发现了关于 .NET 3.5 的错误,但问题涉及异步 I/O 线程,而不是工作线程。不过,谢谢。
-
ASP.NET 很重要。又叫什么“回收应用程序池”?这当然也会重置线程池。
标签: c# performance threadpool