Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 后台进程WPF的性能问题_C#_Wpf_Multithreading - Fatal编程技术网

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
语句

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

如果您的代码,而不是外部代理,导致了需要做的工作,您也可以考虑生产者/消费者模式。在这种情况下,看看,这使小鬼