C#或其他:while循环以更新输入和处理

本文关键字:更新 输入 处理 循环 其他 while | 更新日期: 2023-09-27 18:27:22

我正在开发一个监控软件,它基本上读取输入(通过网络模块),并在处理后生成事件。

虽然输入可以取决于通信速度,并且可以在多线程中运行,但处理基本上是一个连续的循环,基本上是:

while (true)
{
    readInputs();
    process();
}

这看起来很简单,但正如你所能想象的,cpu将达到100%。如果你想让其他循环运行,主要是针对定时事件。因此,虽然进程可以在最后休眠,但定时事件不能。

我的问题是:在不让应用程序占用整个cpu周期的情况下,收集和处理输入的最佳方式是什么?

更新1:该应用程序是多线程的,并且具有用户界面。计时器用于更新用户界面(从共享内存处理的内容和输入状态)。而循环用于输入读取和处理。

C#或其他:while循环以更新输入和处理

在我的选择中,最好的方法是使用计时器并每秒调用这两个函数,如果需要,可以更频繁地调用,但这取决于它们做了多少工作。

例如:

System.Timers.Timer timer;
void SetupTimer()
{
    timer= new System.Timers.Timer();//create timer
    timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);//attach event handler
    timer.Interval = 1000;//set to fire every 1 second
    timer.Enabled = true;//starts the timer
}
void OnTimedEvent(object source, ElapsedEventArgs e)
{
    DoTasks();
}
void DoTasks()
{
    readInputs();
    process();    
}

您还可以添加一个isBusy标志,以确保在下一个计时器超时事件发生时,如果任务仍在处理中,那么它不会再次运行它们,当然这取决于您的确切需求。例如:

bool isBusy = false;
void DoTasks()
{
    if(isBusy)
        return;
    isBusy = true;
    readInputs();
    process();    
    isBusy = false;
}

虽然这不是一个坏主意,但您有两个问题。
1) CPU最后
2) 读/写时可能软件挂起

要解决第一个问题,只需给当前线程一些睡眠。

while (true)
{
    readInputs();
    Thread.Sleep(300); // more then 100
    process();
}

使用SpinWait.PinUntil 读写来解决第二个问题

我希望这会有所帮助。问候