2

因此,我们正在使用 Windows azure 设置一个工作角色,它以非常高的 CPU 利用率运行。我认为这与本节有关,但我不确定该怎么做。每个启动的单独线程都有自己的睡眠,但主线程只是在一个 while 循环中运行。不应该在那里睡觉吗?

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) {  }
        }
4

4 回答 4

2

你的改变在我看来不错。有时我使用Thread.Sleep(Timeout.Infinite).

你测试过吗?它会降低CPU使用率吗?可能是任务本身实际上消耗了大量 CPU。我们还不确定while循环是罪魁祸首。

于 2012-10-16T18:42:11.647 回答
2

while循环可能导致您的 CPU 过高。这基本上是一个无限的忙等待。只要您等待的任务永远不会退出,您的第二个代码示例应该可以正常工作。在我个人看来,最好的解决方案是我在此处的回答中概述的解决方案。如果你不喜欢这样,一个更简单的解决方案是在循环中添加一个 Sleep() 。例如:

while(true){
    Thread.Sleep(10000);
}
于 2012-10-16T18:42:31.753 回答
1

while带有空主体的循环将完全加载线程被调度到的 CPU 内核。这是个坏主意——你浪费了 CPU 时间。

一个更好的解决方案是插入一个Thread.Sleep()周期从 100 毫秒到无穷大的周期 - 这并不重要。

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

一旦你摆脱了空循环体,你就不可能做得比这更好 - 无论你在循环中做什么,当实例停止时,线程无论如何都会终止。

于 2012-10-17T07:31:42.047 回答
0

昨晚在登台测试后,今天早上刚刚将其部署到生产环境中。似乎工作得很好。后台进程的 CPU 使用率从 99.5% 下降到平均 0.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) {  }
        }
于 2012-10-17T17:07:36.760 回答