簡體   English   中英

C#-改進多線程應用程序設計

[英]C# - Improving a Multi-Threaded Application Design

規格

  • C#分布式應用程序。
  • 客戶端/服務器設計。
  • 客戶端(Winforms),服務器(Windows服務),通過.Net Remoting的通信。
  • 以下問題與應用程序的服務器端有關。
  • (編輯)的服務器上的應用程序運行的服務器端8個核心12GB拉姆
  • (編輯)由於同一台服務器上正在運行許多其他服務,因此該服務器的CPU 使用率始終達到80%左右。

腳本

  • 我繼承了一個大型的遺留應用程序。
  • 它執行一堆任務,其中一些任務是獨立的,而其他任務則不是。
  • 該應用程序的當前設計涉及創建14個線程,每個線程運行1個任務或多個任務。
  • 問題是我感到這種設計元素會影響性能

代碼示例-如何設計和運行每個類/線程

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM