[英]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.