后台进程WPF

时间:2015-07-20 19:57:00

标签: c# wpf multithreading

在我的应用中,我需要一个可以在后台运行的流程,并检查各种变化。然后做一些逻辑。大多数情况下,此过程将处于空闲状态,只是等待触发点。所以这就是我所做的:

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。我正在寻找更好的解决方案

1 个答案:

答案 0 :(得分:3)

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

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

如果您的代码而不是外部代理导致需要工作,您还可以考虑生产者/消费者模式。在这种情况下,请查看BlockingCollection,这样可以快速实现该模式。

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

根据您的修改

更新

  

基本上变量MyStatus是一个全局变量,当进程必须被触发时#34;例如,状态变为1。对不起,代码中已经清楚了。

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

  

应用程序关闭时,全局变量isRunning变为false。

当应用程序关闭时,background thread会自动关闭。