首页 / 知识
关于c#:何时不应该在.Net中使用ThreadPool?
2023-04-12 03:54:00

When should I not use the ThreadPool in .Net?什么时候不应该在.Net中使用ThreadPool? 看起来最好的选择是使用ThreadPool,在这种情况下,为什么它不是唯一的选择? 您对此有何经验? @Eric,我将不得不同意Dean的观点。线程很昂贵。您不能假设您的程序是唯一正在运行的程序。当每个人都对资源贪婪时,问题就会成倍增加。
适当的时候很好。但是,如果您需要一堆工作线程,那么您要做的就是使代码更复杂。现在,您必须编写代码来管理它们。如果您仅使用了线程池,则将免费获得所有线程管理。而且,与您自己编写的内容相比,该语言提供的线程池很可能更健壮,更有效且错误更少。
我希望您通常在
在现代硬件上,毫秒级时间很长。在3GHz的机器上,这是300万个周期。同样,您不是唯一一个创建线程的人。您的线程与其他所有程序的线程竞争CPU。如果您使用的线程不是太多,另一个程序也是如此,那么您一起使用的线程太多了。
确实。不要让生活变得更复杂。如果您的程序需要多个工作线程,请不要浪费时间。使用线程池。这就是为什么它在那里。您会滚动自己的字符串类吗?
我不使用
有很多原因导致您需要跳过
另外,请查看新的Parallel Extensions Framework,该框架中包含一些精巧的东西,可以满足您的需求,而不必使用 每当您具有辅助线程的概念时,线程池就有意义。任何时候只要您可以轻松地将处理划分为较小的作业,每个作业都可以独立处理,则工作线程(以及线程池)有意义。 当您需要执行完全不同且无关的动作(不能视为"工作")的线程时,线程池就没有意义。例如,一个线程用于GUI事件处理,另一个线程用于后端处理。当处理形成管道时,线程池也没有意义。 基本上,如果您有启动,处理作业并退出的线程,则可能要使用线程池。否则,线程池并没有真正的帮助。 为了解决这个问题,我要补充一点,如果您需要确保您的线程将立即开始工作,那么最好不要使用ThreadPool线程。每个应用程序域中正在运行的线程池化线程的最大数量受到限制,因此,如果它们都很忙,您的工作可能需要等待。毕竟,它被称为"队列用户工作项"。 当然,有两个警告:
嗯,来自权威的争论-但要时刻注意那些可能在Windows内核团队中工作的人。 我们俩都没有争论这样一个事实,即如果您有一些特定要求,那么.NET ThreadPool可能不是正确的选择。我们反对的是将创建线程的机器成本微不足道。 首先,在ThreadPool的存在理由上创建线程会产生大量开销。我不希望我的机器充满由错误地了解创建线程的开销的人编写的代码,例如,不知道它会导致在每个单独的DLL中调用一个方法。附加到进程中(其中一些将由第三方创建),并且很可能会加重根本不需要在RAM中并且几乎肯定不需要在L1中的代码负载。 现代计算机中内存层次结构的形状意味着"分散" CPU是您可能会做的最坏的事情,每个关心自己工艺的人都应该努力避免它。
当您要执行需要很长时间的操作,或者可能需要一个连续的后台线程时。 线程池线程适用于同时满足以下两个条件的任务: 使用线程池线程而不是创建新线程池将节省大量但有限的时间。如果与执行任务所需的时间相比,该时间很长,则线程池任务可能是合适的。但是,执行任务所需的时间越长,使用线程池的好处越小,并且该任务阻碍线程池效率的可能性也越大。 MSDN在这里列出了一些原因: http://msdn.microsoft.com/zh-CN/library/0ka9477y.aspx
埃里克
您是编写程序的唯一目标客户吗?如果不是,您将无法确定大多数情况。通常,您在编写程序时不知道它是否可以有效地单独执行,还是可以在受到DDOS攻击的Web服务器上运行。您不知道要使用多少CPU时间。 假设程序的行为基于输入而变化,那么很少知道确切的程序消耗多少内存或CPU时间。当然,您应该对程序的行为有一个很好的了解,但是绝不会对大多数程序进行分析来确定要使用多少内存,多少句柄等,因为全面的分析非常昂贵。如果您不编写实时软件,那么付出的代价就不值得了。 通常,声称确切了解您的程序将如何运行是一件很困难的事,并且声称了解有关计算机的所有信息都非常荒谬。
我并不完全不同意,但是我真的看不出这有什么关系。该站点专门用于此处,因为程序员并非始终都能获得所有答案。
不需要。如果我需要一个线程池,我将使用提供的线程池,除非直到发现它不够用为止。我不会简单地假设所提供的线程池不足以满足我的需求,而无需确认情况是否如此。
我的大部分专业经验是关于多线程和多处理程序的。我经常也需要推出自己的解决方案。这并不意味着线程池是无用的,或者在许多情况下是适当的。建立线程池是为了处理工作线程。在适合使用多个工作线程的情况下,通常应首先使用提供的线程池。 |
最新内容
相关内容
python类什么时候用
python类什么时候用,数据,地址,概念,培训,实例,下来,名称,方法,变量,参数,面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是python实现线程安全的单例模式
python实现线程安全的单例模式,培训,线程,模式,python线程和进程的区别
python线程和进程的区别,系统,数据,培训,单位,进程,线程,管理,时间,通讯,地址,python引入进程和线程的概念及区别threading模块提供的类:Threapython如何选择python版本?
python如何选择python版本?,项目,代码,培训,名字,地方,系统,里面,版本,问题,变量,Python3.7已经发布了,目前Python的用户,主要使用的版本应该是python什么是主线程
python什么是主线程,培训,单位,主线,线程,结束,任务,案例,结果,最小,进程,Python主线程和子线程setDaemon(False)当一个进程启动之后,会默认产python选择perl还是python
python选择perl还是python,代码,工具,培训,第三,大规模,初级,设计,时间,设备,网络,Perl,一种功能丰富的计算机程序语言,运行在超过100种计算机python什么时候用python
python什么时候用python,标准,系统,分析,服务,网络,通信,数据,平台,培训,管理,Python作为通用的多用途编程语言,能为不同领域构建应用程序和系python选择python2还是python3?
python选择python2还是python3?,电脑,培训,时间,项目,动力,公司,官方,理由,答案,建议,看到很多新同学在学习Python的过程中,犹豫学习Python2还python创建多线程的两种方法
python创建多线程的两种方法,培训,第一,代码,业务,方法,线程,函数,任务,演示,实例,当我们使用python编程的过程中需要多个输出的任务的话,为了python创建新线程有哪些方法
python创建新线程有哪些方法,培训,方法,线程,对象,测试,实例,以上,参数,教程,更多,python创建新线程有哪些方法1、方法(1)直接创建threading.关于断言:断言什么时候应该保留在生
关于断言:断言什么时候应该保留在生产代码中?,关于断言:断言什么时候应该保留在生产代码中?,断言,语言,调试,进行了,When should asserti关于oop:什么时候应该在C ++中使用&
关于oop:什么时候应该在C ++中使用friend?,关于oop:什么时候应该在C ++中使用friend?,语言,声明,我对,感兴趣,When should you use 'fri