2

Windows azure で worker ロールを設定していますが、非常に高い 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が高くなっている可能性があります。それは基本的に無限のビジーウェイトです。待機しているタスクが終了しない限り、2番目のコードサンプルは正常に機能するはずです。私の個人的な意見では、最善の解決策は、ここでの私の回答に概説されているものです。それが気に入らない場合は、より簡単な解決策は、ループ内に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% から .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 に答える