2012-10-16 71 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 */); 
} 

一旦你摆脱你不可能做任何比这更好的空循环体的 - 无论你在做循环实例时停止该线程将被终止反正。

相关问题