进度条绑定未从线程更新

时间:2012-07-31 21:13:53

标签: c# wpf multithreading progress-bar

我正在尝试将CPU使用情况更新到线程的进度条上。

我在这里的代码是:

    private static int _cpuUsage;
    protected PerformanceCounter cpuCounter;
    private Thread thread;

public CPUUsageIndModel()
    {
    cpuCounter = new PerformanceCounter
                     {CategoryName = "Processor", CounterName = "% Processor Time", InstanceName = "_Total"};
    thread = new Thread(GetCurrentCpuUsage);
    thread.Start();
    }

public void GetCurrentCpuUsage()
{
    while (true)
    {
        _cpuUsage = Convert.ToInt32(Math.Round(cpuCounter.NextValue()));
        Thread.Sleep(1000);
    }
} 

public int GetCPUUsage
{
    get { return _cpuUsage; }
    set
    {
        _cpuUsage = value;
        NotifyPropertyChanged("_cpuUsage");
    }
}

现在问题是我尝试用以下方式启动线程:

public void GetCurrentCpuUsage()
{
   _cpuUsage = 40;
}

它工作正常,因此使cpuCounter和循环使用。

任何人都可以指出我可能犯过的任何错误。

由于

编辑 - 完整课程和一些小调整:

public class CPUUsageIndModel : INotifyPropertyChanged
    {
        public static int _cpuUsage;
        protected PerformanceCounter cpuCounter;
        private Thread thread;

        public CPUUsageIndModel()
        {
            cpuCounter = new PerformanceCounter
                             {CategoryName = "Processor", CounterName = "% Processor Time", InstanceName = "_Total"};
            thread = new Thread(GetCurrentCpuUsage);
            thread.Start();
        }

        public void GetCurrentCpuUsage()
        {
            while (true)
            {
                CPUUsage = Convert.ToInt32(Math.Round(cpuCounter.NextValue()));
                Thread.Sleep(1000);
            }
        } 

        public int CPUUsage
        {
            get { return _cpuUsage; }
            set
            {
                _cpuUsage = value;
                NotifyPropertyChanged("_cpuUsage");
            }
        }


        #region INotifyPropertyChanged
        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(String info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }
        #endregion
    }

2 个答案:

答案 0 :(得分:1)

您需要通知WPF运行时更改。为此,您实现了INotifyPropertyChanged接口。

你似乎在这里尝试,但你没有以正确的方式做到(你没有显示所有相关的代码,但我相当确定你的实现是不正确的。)

你需要: 1.绑定到公共财产(我们在您粘贴的代码中看不到这一点) 2.如果值已更改,则从属性的setter发送通知 3.通过属性设置器

更改值

您可能正确地执行了第一点,我们没有看到这一点,但您正在通知私有字段已更改,并且您应该通知该属性已更改(NotifyPropertyChanged("GetCPUUsage"))。您也可以通过直接访问字段(_cpuUsage = 40;)来设置值,您应该通过setter(GetCPUUsage = 40;)来设置。

在这种情况下,您的属性名称有点奇怪。我将GetCPUUsage重命名为CPUUsage,因为您可以获取并设置它的值。前缀获取也应该用于方法,而不是属性。

答案 1 :(得分:1)

看起来你几乎是对的,至少从编辑中看。只是,您在字段名称而不是属性名称上引发了更改的属性。这是修复:

public int CPUUsage
        {
            get { return _cpuUsage; }
            set
            {
                _cpuUsage = value;
                NotifyPropertyChanged("CPUUsage"); // Notify CPUUsage not _cpuUsage
            }
        }

并且您的绑定应该看起来像{Binding Path = CPUUsage}