gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:21:24 25 4
gpt4 key购买 nike

学习 C#、WPF。我遇到了一个仅靠研究无法解决的问题。

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

我知道线程已启动、正在工作并且有可用于填充文本框的数据。我不知道如何从第二个线程解决 GUI 中的文本框控件。

我的文本框控件称为“txt_CPU”,我希望“cpuCount”出现在其中。我确定我需要使用委托(delegate),但我无法将示例与我的代码相关联。

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

所以我们有线程创建。

 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);

}
}
}

最佳答案

一种方法是将事件处理程序添加到您的 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;
}
}

然后像这样在你的 main 中使用它:
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)。

关于c# - 在另一个类中从另一个线程更新文本框内容。 C#,WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8458956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com