簡體   English   中英

C#多線程代碼中的CPU使用率高

[英]High CPU usage in C# multi-threaded code

我沒有編寫好的多線程代碼的知識。 我剛開始在需要的項目上工作。 我已經編寫了以下代碼,它可以按我的意願工作,但是,CPU使用率很高。 我假設這是由於我如何使用線程。 如果有人指出以下代碼中的缺陷並讓我知道如何修復它,以使CPU使用率不高,我將不勝感激。

var numberOfMinutes = Convert.ToInt32(ConfigurationManager.AppSettings["NumberOfMinutesToRun"]);
var traversals = DbLayer.GetTraversals().ToList();
var numberOfThreads = Convert.ToInt32(ConfigurationManager.AppSettings["NumberOfThreads"]);
var threads = new List<Thread>(numberOfThreads);
var counter = 1;
var s = new Stopwatch();
s.Start();
var sync = new object();
while (s.Elapsed < TimeSpan.FromMinutes(numberOfMinutes))
{
    for (var i = 0; i < (numberOfThreads - threads.Count); i++)
    {
        var counter1 = counter; // due to closure.
        var traversal = traversals.FirstOrDefault(t => t.Id == counter1);
        var threadStart = new ThreadStart(new CallHelper(traversal).Migrate);
        var i1 = i;
        threadStart += () =>
                       {
                            threads.RemoveAt(i1);
                       };
        threads.Insert(i, new Thread(threadStart) {IsBackground = true});
        threads[i].Start();
        lock (sync)
        {
            counter++;
            if (counter > 6)
            {
                counter = 1;
            }
        }
    }
}
s.Stop();

我更新了代碼,以顯示希望得到的幫助。 遍歷集合僅包含6個項目。 計數器在那里,以確保線程遍歷遍歷集合中的6個項目中的每一個。 CallHelper類僅在每次遍歷上執行一個運行時間很長的任務。 該應用程序旨在使用可配置數量的線程在可配置的時間內對6個不同的對象執行長期運行的任務。 希望我已經填補了足夠的空白。

在線上有各種資源可用於編寫優質高效的多線程代碼。 “良好”通常指有效且健壯的代碼。 為了獲得有效的代碼,請使用嵌入式資源。

我只掃描了您的代碼,但可以看到各種問題並可以提供建議。

  1. 使用線程池。 建立和拆除線程非常昂貴。
  2. 盡可能不頻繁地重復循環(如上所述)。
  3. 需要延遲時,請使用睡眠而不是繁忙的循環。
  4. 使用非平凡的代碼來測試效率。 如果您要對瑣碎的代碼進行測試,則利用率將由程序(而不僅僅是線程)的安裝和拆卸控制,這非常昂貴,並且將主導cpu的利用率。
  5. 衡量您感興趣的代碼的利用率,並排除不感興趣的代碼,例如應用程序設置和拆卸。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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