2012-10-16 124 views
2

所以我們用windows azure設置了一個工作者角色,並且它的CPU利用率非常高。我認爲這與本節有關,但我不知道該怎麼做。每個開始的線程都有自己的睡眠,但主線程只是在while循環中運行。難道那裏不應該有睡眠嗎?Windows Azure工作者角色,如何處理主線程?

public class WorkerRole : RoleEntryPoint 
    { 
     private List<ProcessBase> backgroundProcesses = new List<ProcessBase>(); 

     public override void Run() 
     { 
      // This is a sample worker implementation. Replace with your logic. 
      Trace.WriteLine("BackgroundProcesses entry point called", "Information"); 

      foreach (ProcessBase process in backgroundProcesses) 
      { 
       if (process.Active) 
       { 
        Task.Factory.StartNew(process.Run, TaskCreationOptions.LongRunning); 
       } 
      } 

      while (true) { } 
     } 

這樣的事情怎麼樣?

public override void Run() 
     { 
      // This is a sample worker implementation. Replace with your logic. 
      Trace.WriteLine("BackgroundProcesses entry point called", "Information"); 

      List<Task> TaskList = new List<Task>(); 

      foreach (ProcessBase process in backgroundProcesses) 
      { 
       if (process.Active) 
       { 
        TaskList.Add(Task.Factory.StartNew(process.Run, TaskCreationOptions.LongRunning)); 
       } 
      } 

      Task.WaitAll(TaskList.ToArray()); 
      //while (true) { } 
     } 

回答

0

昨天晚上在舞臺上進行了測試後,今天早上纔將它部署到了產品中。似乎工作很好。 CPU使用率從99.5%降至後者的平均水平.03%...

public override void Run() 
     { 
      // This is a sample worker implementation. Replace with your logic. 
      Trace.WriteLine("BackgroundProcesses entry point called", "Information"); 

      List<Task> TaskList = new List<Task>(); 

      foreach (ProcessBase process in backgroundProcesses) 
      { 
       if (process.Active) 
       { 
        TaskList.Add(Task.Factory.StartNew(process.Run, TaskCreationOptions.LongRunning)); 
       } 
      } 

      Task.WaitAll(TaskList.ToArray()); 
      //while (true) { } 
     } 
2

你的改變對我來說很不錯。有時我使用Thread.Sleep(Timeout.Infinite)

你測試過了嗎?它會減少CPU使用率嗎?這可能是因爲任務本身實際上消耗了大量的CPU。我們當然不知道,while循環是罪魁禍首。

+0

它將CPU從99%降到1.5%,所以我概述的解決方案似乎工作正常。應該沒問題,只是等待或多或少永遠,我希望... –

2

while循環可能導致您的CPU過高。它基本上是一個無限的忙碌等待。您的第二個代碼示例應該可以正常工作,只要您等待的任務永遠不會退出。我個人認爲最好的解決方案是my answer here中列出的那個。如果你不喜歡這樣,一個更簡單的解決方案是在循環內添加一個Sleep()。例如:

while(true){ 
    Thread.Sleep(10000); 
} 
1

while環空的身體就會完全加載到線程調度的CPU核心。這是一個壞主意 - 你無法正確地刻錄CPU時間。

一個更好的解決方案是插入一個Thread.Sleep(),週期從100毫秒到無限的任何地方 - 這並不重要。

while(true) { 
    Thread.Sleep(/*anything > 100 */); 
} 

一旦你擺脫你不可能做任何比這更好的空循環體的 - 無論你在做循環實例時停止該線程將被終止反正。

相關問題