从另一个类中的另一个线程更新文本框内容。 C#,WPF

时间:2011-12-10 18:45:45

标签: c# wpf multithreading

学习C#,WPF。我遇到过一个单靠研究无法解决的问题。

我想从另一个类中存在的另一个线程更新文本框控件的文本。

我知道线程已启动,正在运行并且有可用于填充文本框的数据。我无法弄清楚如何从第二个线程解决GUI中的文本框控件。

我的文本框控件名为'txt_CPU',我希望'cpuCount'出现在其中。我确定我需要使用委托,但我无法将这些示例与我的代码联系起来。

帮助表示赞赏。 (我确信我的代码中可能存在其他“问题”,这是正在进行的粗略学习)

所以我们有线程创建。

 public MainWindow()
        {
            InitializeComponent();

            //start a new thread to obtain CPU usage
            PerformaceClass pc = new PerformaceClass();
            Thread pcThread = new Thread(pc.CPUThread); 
            pcThread.Start();

        }

它正在调用的类

 public class PerformaceClass
    {

            public string getCPUUsage()
            {
                PerformanceCounter cpuCounter;

                cpuCounter = new PerformanceCounter();

                cpuCounter.CategoryName = "Processor";
                cpuCounter.CounterName = "% Processor Time";
                cpuCounter.InstanceName = "_Total";
                return cpuCounter.RawValue.ToString() + "%";

            }

        public void CPUThread()
        {
            PerformaceClass PC = new PerformaceClass();

            int i = 0;
            while (i < 5)
            {
                string cpuCount = PC.getCPUUsage();
                i++;
                System.Threading.Thread.Sleep(500);
                // MessageBox.Show(cpuCount);

            }   
        }
    }

1 个答案:

答案 0 :(得分:3)

一种方法是向PerformaceClass添加事件处理程序,如下所示:

 public class PerformanceClass
 {
     public event EventHandler<PerformanceEventArgs> DataUpdate;

     ....
     public void CPUThread()
     {
        int i = 0;
        while (i++ < 5)
        {
            string cpuCount = getCPUUsage();
            OnDataUpdate(cpuCount);
            System.Threading.Thread.Sleep(500);

        }   
     }

     private void OnDataUpdate(string data)
     { 
          var handler = DataUpdate;
          if (handler != null)
          {
               handler(this, new PerformanceEventArgs(data));
          }
     }
 }

 public class PerformanceEventArgs: EventArgs
 {
       public string Data { get; private set; }
       public PerformanceEventArgs(string data)
       {
            Data = data;
       }
 }

然后在你的主要使用它:

public MainWindow()
{
    InitializeComponent();

    //start a new thread to obtain CPU usage
    PerformanceClass pc = new PerformanceClass();
    pc.DataUpdate += HandleDataUpdate;
    Thread pcThread = new Thread(pc.CPUThread); 
    pcThread.Start();
}

private void HandleDataUpdate(object sender, PerformanceEventArgs e)
{
     // dispatch the modification to the text box to the UI thread (main window dispatcher)
     Dispatcher.BeginInvoke(DispatcherPriority.Normal, () => { txt_CPU.Text = e.Data });
}

请注意,我修正了PerformanceClass中的拼写错误(缺少n)。