gpt4 book ai didi

c# - 为什么 ThreadPool.SetMinThreads 没有改变最小值?

转载 作者:行者123 更新时间:2023-11-30 16:19:56 26 4
gpt4 key购买 nike

使用 .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

该值会立即更改,但不会永久更改。

我为什么要这样做? Timer 使用默认的 ThreadPool,我曾见过突然一批任务进入系统线程池,淹没它,导致一些本应每 15 秒触发一次的计时器延迟超过60 秒。

问题是,当我将相同的信息转储到运行时十五分钟时,使用相同的代码,我得到了非常不同的值:

Worker thread: 4 / 400
IO thread : 4 / 400

在不放弃使用 System.Timers.Timer 的情况下,是否有更好的方法来解决这个问题?在完全不涉及 IIS 的独立 C# 应用程序中,什么会重置此值?如果您是自托管 ASP.NET,这是否会隐式更改系统线程池的调整?

最佳答案

我会建议另一种方法。

从线程池中消除所有 阻塞代码。这不是它的设计目的。

如果您有 IO 绑定(bind)操作,请在每个阶段采用异步操作。

如果您有 CPU 密集型操作,请不要在 ThreadPool 线程中运行它们。

通过严格遵守这些规则,您永远不需要摆弄 ThreadPool 参数。正如您所注意到的,有太多的 .Net API 完全依赖响应式线程池。如果您只是吞噬线程,那么无论您选择多少线程,如果您运行程序的时间/强度足够长,您很可能会再次达到极限。

按预期使用 ThreadPool...短暂的逻辑,主要用于将 IO 结果编码到正确的位置。

关于c# - 为什么 ThreadPool.SetMinThreads 没有改变最小值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14821874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com