C# 后台进程WPF的性能问题
在我的应用程序中,我需要一个在后台工作的过程,并检查各种事情的变化。然后做一些逻辑分析。在大多数情况下,此进程将处于空闲状态,只是等待触发点。这就是我所做的:C# 后台进程WPF的性能问题,c#,wpf,multithreading,C#,Wpf,Multithreading,在我的应用程序中,我需要一个在后台工作的过程,并检查各种事情的变化。然后做一些逻辑分析。在大多数情况下,此进程将处于空闲状态,只是等待触发点。这就是我所做的: private void MyBackgoroundThread() { while (isRunning) { if (MyStatus == 1) { //Log removed } } } 然后在运行时,构造函数将使用以下命令调用它:
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
。抱歉,代码中的想法很清楚
@鉴于“背景”任务是一项复杂的任务,这似乎很危险
无限循环,等待应该如何返回
你是问题的关键。全局变量
isRunning
在应用程序关闭时更改为false。我正在寻找一个更好的解决方案您或多或少地使用一个CPU来不断迭代您的语句,而
语句
最佳解决方案取决于您在该代码中所做的操作。如果可能,使用事件或类似通知来触发后台工作,而不是轮询线程。例如,如果要查找对文件的更改,请使用
如果您的代码,而不是外部代理,导致了需要做的工作,您也可以考虑生产者/消费者模式。在这种情况下,请看一看,这使得实现该模式非常简单
如果无法使用基于事件的通知机制触发后台工作,则可以使用Thread.Sleep()至少让轮询线程睡眠一段时间,直到它必须醒来并再次检查工作 根据您的编辑进行更新 基本上,变量MyStatus是一个全局变量,例如,当进程必须被“触发”时,状态变为1。抱歉,代码中的想法很清楚 将其从全局变量更改为静态属性,并在值更改时触发事件。不要使用轮询线程,而是使用一些订阅新事件的代码 全局变量isRunning在应用程序关闭时更改为false当应用程序关闭时,A将自动关闭。您或多或少地使用1个CPU来不断迭代
while
语句
最佳解决方案取决于您在该代码中所做的操作。如果可能,使用事件或类似通知来触发后台工作,而不是轮询线程。例如,如果要查找对文件的更改,请使用
如果您的代码,而不是外部代理,导致了需要做的工作,您也可以考虑生产者/消费者模式。在这种情况下,请看一看,这使得实现该模式非常简单
如果无法使用基于事件的通知机制触发后台工作,则可以使用Thread.Sleep()至少让轮询线程睡眠一段时间,直到它必须醒来并再次检查工作 根据您的编辑进行更新 基本上,变量MyStatus是一个全局变量,例如,当进程必须被“触发”时,状态变为1。抱歉,代码中的想法很清楚 将其从全局变量更改为静态属性,并在值更改时触发事件。不要使用轮询线程,而是使用一些订阅新事件的代码 全局变量isRunning在应用程序关闭时更改为false当应用程序关闭时,A将自动关闭。您或多或少地使用1个CPU来不断迭代
while
语句
最佳解决方案取决于您在该代码中所做的操作。如果可能,使用事件或类似通知来触发后台工作,而不是轮询线程。例如,如果要查找对文件的更改,请使用
如果您的代码,而不是外部代理,导致了需要做的工作,您也可以考虑生产者/消费者模式。在这种情况下,请看一看,这使得实现该模式非常简单
如果无法使用基于事件的通知机制触发后台工作,则可以使用Thread.Sleep()至少让轮询线程睡眠一段时间,直到它必须醒来并再次检查工作 根据您的编辑进行更新 基本上,变量MyStatus是一个全局变量,例如,当进程必须被“触发”时,状态变为1。抱歉,代码中的想法很清楚 将其从全局变量更改为静态属性,并在值更改时触发事件。不要使用轮询线程,而是使用一些订阅新事件的代码 全局变量isRunning在应用程序关闭时更改为false当应用程序关闭时,A将自动关闭。您或多或少地使用1个CPU来不断迭代
while
语句
最佳解决方案取决于您在该代码中所做的操作。如果可能,使用事件或类似通知来触发后台工作,而不是轮询线程。例如,如果要查找对文件的更改,请使用
如果您的代码,而不是外部代理,导致了需要做的工作,您也可以考虑生产者/消费者模式。在这种情况下,看看,这使小鬼