[英]C# - Improving a Multi-Threaded Application Design
public class ManageThreads
{
private Thread doStuffThread = null;
//Inside the constructor EVERY thread is instantiated and run.
//(I am aware that this example only shows the use of 1 thread).
public ManageThreads()
{
doStuffThread = new Thread(new ThreadStart(DoSomeStuff.Instance.Start));
doStuffThread.Start();
//Instantiate and run another thread.....
//Instantiate and run another thread.....
//Instantiate and run another thread.....etc.
}
}
public class DoSomeStuff
{
void Start()
{
while(true)
{
//Repeatedly do some tasks.....
Thread.Sleep(5000);
}
}
}
帮助极大的赞赏。
“我感到这种设计元素会影响性能。”
不要猜测,将探查器拿出来并测量发生了什么。 收集一些有关在应用程序中花费时间的经验统计信息,然后您可以查看收缩点在哪里。
如果花费时间来创建线程是您最大的头疼,那么迁移到线程池可能是正确的答案,但是如果不进行一些取证分析,您将不会知道。
从您发布的小片段中可以看出,这14个线程的寿命相当长,它们在整个生命周期中都会做很多事情,所以我怀疑这实际上不是问题所在,但是您的帖子中没有足够的信息来完成对此的明确呼吁。
如果线程全部都在工作,并且活动线程多于处理器,那么您将花费时间进行上下文切换。
如果您有双核处理器,不要期望通过4个以上的活动工作线程获得出色的性能。
因此,除非有一个可以管理该工作的处理器,否则从14个都在工作的线程开始是一个坏主意。 物理处理器体系结构和功能集对此有很大的影响。 我的观点是,线程池将帮助管理上下文切换,但是一次启动14个繁忙线程总是会降低性能……通过顺序地执行线程操作,可能会获得更快的性能。 显然,这是一个重要的声明,可能不是trus,但您可以理解要点。
因此,使用线程池和事件探查器来找出可用于线程池的最佳线程数。
在大多数情况下,当人们使用线程池时,很多线程在大多数时间都无所事事,或者线程正在休眠/阻塞,同时一些缓慢的操作或外部依赖关系正在等待响应。
考虑使用异步模式,以便您可以从线程中获取有关进度的信息。
在双核处理器上,如果它们都在100%的时间内都在工作,我会犹豫地增加3个以上的线程
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.