后台进程WPF的性能问题

本文关键字:问题 性能 WPF 后台进程 | 更新日期: 2023-09-27 18:03:34

在我的应用程序中,我需要一个过程,将在后台工作,并检查各种事物的变化。然后做一些逻辑分析。大多数时候,这个进程是空闲的,只是在等待触发点。这就是我所做的:

private void MyBackgoroundThread()
{
    while (isRunning)
    {
        if (MyStatus == 1)
        {
            //Log removed
        }
    }
}

然后在运行时由构造函数用下列语句调用;

await Task.Run(() => MyBackgoroundThread());

现在可以完美地工作了。现在的问题是,我的应用程序在空闲时使用了大约35%的CPU使用率。禁用MyBackgoroundThread,应用程序在空闲时使用0%的CPU使用率。所以我知道是这个线程。

我明白为什么会发生这种情况,但我的问题是处理这种情况的最佳实践是什么,这样我就不会因为什么都不做而消耗35%的CPU。

编辑:基于评论;

@Dour High Arch解释"触发点"是什么

基本上,变量MyStatus是一个全局变量,当进程必须被"触发"时,状态将更改为1。对不起,我认为代码很清楚。

@Ron Beyer这似乎很危险,因为"后台"任务是一个无限循环,await应该如何返回?

好吧,你正处于问题的核心。全局变量isRunning在应用程序关闭时被更改为false。我正在寻找一个更好的解决方案

后台进程WPF的性能问题

您正在使用1个CPU,或多或少,不断迭代您的while语句。

最好的解决方案取决于你在代码中做什么。如果可能的话,使用事件或类似的通知来触发后台工作,而不是轮询线程。例如,如果您正在查找对文件的更改,请使用FileSystemWatcher。

如果是你的代码,而不是外部代理,导致需要做工作,你也可以考虑生产者/消费者模式。在这种情况下,看看BlockingCollection,它使实现该模式变得非常容易。

如果没有办法使用基于事件的通知机制来触发后台工作,你可以使用thread . sleep()至少让你的轮询线程休眠一段时间,直到它必须唤醒并再次检查工作。

根据您的编辑更新

基本上,变量MyStatus是一个全局变量,例如,当必须"触发"流程时,状态将更改为1。对不起,我认为代码很清楚。

将其从全局变量更改为静态属性,并在值更改时触发事件。使用一些代码来订阅新事件,而不是使用轮询线程。

全局变量isRunning在应用程序关闭时被更改为false。

应用程序关闭时,后台线程会自动关闭。