在我的应用中,我需要一个可以在后台运行的流程,并检查各种变化。然后做一些逻辑。大多数情况下,此过程将处于空闲状态,只是等待触发点。所以这就是我所做的:
private void MyBackgoroundThread()
{
while (isRunning)
{
if (MyStatus == 1)
{
//Log removed
}
}
}
然后在运行时,构造函数将使用follow;
调用它await Task.Run(() => MyBackgoroundThread());
现在这完美无缺。现在的问题是我的应用程序在空闲时使用大约35%的CPU使用率。禁用MyBackgoroundThread
应用程序在空闲时使用0%的CPU使用率。所以我知道这个帖子。
我理解为什么会这样,但我的问题是处理这种情况的最佳做法是什么,所以我不会因为什么都不做而烧掉35%的CPU。
编辑:根据评论;
@Dour High Arch解释“触发点”是什么
基本上变量MyStatus
是一个全局变量,当进程必须被触发时#34;例如,状态变为1
。对不起,代码中已经清楚了。
@Ron Beyer鉴于"背景"任务是一个 无限循环,await应该如何返回?
那么你就是问题所在。应用程序关闭时,全局变量isRunning
将更改为false。我正在寻找更好的解决方案
答案 0 :(得分:3)
您正在使用1个或多或少的CPU来不断迭代while
语句。
最佳解决方案取决于您在该代码中的操作。如果可能的话,使用事件或类似通知来触发后台工作而不是轮询线程。例如,如果您要查找文件更改,请使用FileSystemWatcher。
如果您的代码而不是外部代理导致需要工作,您还可以考虑生产者/消费者模式。在这种情况下,请查看BlockingCollection,这样可以快速实现该模式。
如果无法使用基于事件的通知机制来触发后台工作,您可以使用Thread.Sleep()至少让您的轮询线程休眠一段时间,直到它必须唤醒并检查再次工作。
根据您的修改更新
基本上变量MyStatus是一个全局变量,当进程必须被触发时#34;例如,状态变为1。对不起,代码中已经清楚了。
将其从全局变量更改为静态属性,并在更改值时触发事件。不要使用轮询线程,而是使用一些订阅新事件的代码。
应用程序关闭时,全局变量isRunning变为false。
当应用程序关闭时,background thread会自动关闭。