Высокая загрузка процессора на моем. net ядре Консольное приложение на Raspbian - PullRequest
0 голосов
/ 28 января 2020

У меня есть приложение. net core 3.1, которое занимает 15-20% ЦП при работе на Raspbian (R asp Pi 3). Когда он запускается в Visual Studio на моем Windows P C, график процессора показывает между 0-1%

Само приложение довольно простое, это консольное приложение C# с System.IO.Ports. и RabbitMQ, установленный из NuGet.

Main () сначала устанавливает последовательный порт и назначает mySerialFun c () для события DataReceived. Он также устанавливает RabbitMQ и аналогичным образом назначает myRabbitMQ () для события customer.Received. После того, как main () упадет через некоторое время, l oop

static Main(string[] args)
{
  // setup code and events here
  // ……
  while (runFlag) 
  {
    // Nothing in the loop, just keep the app running
    // Generates 100% CPU
  }
}

Как и на windows, все было хорошо, но на Raspbian приложение занимало бы 100% CPU. Ой ...

Итак, я изменил приложение и добавил в System.Threading и System.Threading.Tasks

Так что мое l oop теперь выглядит так

Static async Task Main(string[] args)
{
  // setup code and events here
  // ……
  while (runFlag) 
  {
    // This generate 15-20% CPU
    await Task.Delay(1000);
  }
}

Это успокоило ЦП до 15-20%

Очевидно, что высокая загрузка ЦП вызвана непрерывной работой во время, так что, каков наилучший способ сделать это, пожалуйста?

У меня есть два функции, которые запускаются, когда что-то происходит на последовательном порту или получено сообщение RabitMQ. Когда никаких событий не происходит, мне просто нужно, чтобы программа работала непрерывно до тех пор, пока для runFlag не будет установлено значение false.

Но в то же время не нужно слишком много загружать ЦП, ведь он работает на R asp Pi .

Есть идеи?

# # ОБНОВЛЕНИЕ # #

Большое спасибо за ваши комментарии по теме.

С тех пор мне удалось получить мое заявление процессор работает на 0,3-1% путем изменения непрерывного l oop согласно приведенному ниже коду.

using System;
using System.Threading;

namespace daemonTest_withThreadSleep
{
    class Program
    {
        // Define a daemonRunFlag for continous running
        static bool daemonRunFlag = true;

        static readonly CancellationTokenSource tokenSource = new CancellationTokenSource();

        static void Main(string[] args)
        {
            // Add event to handle process exits, such as HUP signals.
            AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit;

            // Add the setup code here

            // Add the event functions here

            // Start the Daemon Running
            Console.WriteLine("Starting Daemon");
            while ((daemonRunFlag) && (!tokenSource.Token.IsCancellationRequested))
            {
                // This generates 0.3-1% CPU
                System.Threading.Thread.Sleep(1000);
            }

            Console.WriteLine("Ending Daemon");
        }

        private static void CurrentDomain_ProcessExit(object sender, EventArgs e)
        {
            // Function is called because of an HUP signal.

            // Set the haLogHandle daemonRunFlag to false.
            daemonRunFlag = false;

            // cancel the received token.
            tokenSource.Cancel();
        }
    }

}

Приведенный выше код также включает обработку сигналов HUP во время работы кода на Raspbian.

Хочу отметить, почему System.Threading.Thread.Sleep(1000) обеспечивает более низкую загрузку процессора по сравнению с await Task.Delay(1000)

Есть идеи?

1 Ответ

0 голосов
/ 28 января 2020

Что делает while oop? Просто оставьте приложение живым, чтобы событиями можно было управлять?

Если это так, вы можете просто wait навсегда.

static void Main(string[] args)
{
  // setup code and events here
  // ……
  Task.Delay(-1).Wait();
}

Я помню что-то подобное, работая и поддерживая консольные приложения живыми

...