gpt4 book ai didi

c# - 如何将线程 "report back"创建到主线程?

转载 作者:行者123 更新时间:2023-11-30 14:41:07 25 4
gpt4 key购买 nike

我正在制作一个监控我电脑上的东西的应用程序,我想让它比只实现一个 while 循环更难一些。

所以我的问题是,如果我想在单独的线程中获取 cpu 负载,更新类中的静态变量,我该怎么做

namespace threads
{
class Program
{
static int cpuload = 0;

static void Main(string[] args)
{
while (true)
{
Thread th = new Thread(new ThreadStart(CheckCPULoad));
th.Start();

Thread.Sleep(1000); // sleep the main thread

th.Abort();

Console.WriteLine("load: {0}%", cpuload);
}
}

static void CheckCPULoad()
{
// things are updated every 3 secs, dummy data
Thread.Sleep(3000);

Random rnd = new Random();
cpuload++;// = rnd.Next(0, 100); // dummy data
}
}
}

因为它每次都打印“load: 0%”。我需要修复什么才能显示

load: 0% 
load: 0%
load: 0%

?

谢谢

最佳答案

为了向主线程“报告”,主线程必须“监听”。这意味着,仍在 while 循环中运行并检查某种队列以查找代表报告的新项目。

您基本上需要的是一个队列,工作线程将在其中放置报告,主线程将定期检查此队列以获取来自工作线程的报告。

您有两种主要方法:

  1. 阻塞队列。意味着当调用者线程没有项目阻塞直到元素到达。这是如果主线程什么都没有就好了除了等待项目中的项目排队。
  2. 非阻塞队列。意味着它立即返回给调用者不管项目计数。这如果你想要你的主线程很好忙于做事,有时检查报告队列。

如果您的应用程序是 UI 应用程序,您会自动获得第一种方法,因为这就是 UI 的工作方式。要添加“项目”,您可以使用 Control.BeginInvoke(在 winforms 中)或 Dispatcher.BeginInvoke(在 wpf 中)。

关于c# - 如何将线程 "report back"创建到主线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4537983/

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