后台进程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。我正在寻找一个更好的解决方案
您正在使用1个CPU,或多或少,不断迭代您的while
语句。
最好的解决方案取决于你在代码中做什么。如果可能的话,使用事件或类似的通知来触发后台工作,而不是轮询线程。例如,如果您正在查找对文件的更改,请使用FileSystemWatcher。
如果是你的代码,而不是外部代理,导致需要做工作,你也可以考虑生产者/消费者模式。在这种情况下,看看BlockingCollection,它使实现该模式变得非常容易。
如果没有办法使用基于事件的通知机制来触发后台工作,你可以使用thread . sleep()至少让你的轮询线程休眠一段时间,直到它必须唤醒并再次检查工作。
根据您的编辑更新
基本上,变量MyStatus是一个全局变量,例如,当必须"触发"流程时,状态将更改为1。对不起,我认为代码很清楚。
将其从全局变量更改为静态属性,并在值更改时触发事件。使用一些代码来订阅新事件,而不是使用轮询线程。
全局变量isRunning在应用程序关闭时被更改为false。
应用程序关闭时,后台线程会自动关闭。