C# 窗体之间,字符怎么能做到实时传递??

最近做个上位虚拟机,主窗体通过指定本地的IP和端口号,通过UDP的方式收到数据,比如,每秒收到一串数据,
内容:电压1多少伏,电压2多少伏,电流1多少安,电流2多少安,温度1多少度,温度2多少度,就这几项把,主窗体我用的是TEXT控件把解析出来的内容塞上去显示的。

现在的问题就是,我在主界面上,加了按钮,弹出个子窗口,把主窗口的解析后的数据也在子窗体上显示出来,不知道该怎么写了,,
就是,主窗体每秒收到的6项数据,怎么能实时传递给子窗体(打开情况下)。

img

额,2022年了,连当初被喷的最弱的js都更新好几代了,MVVM是js前端最主流的开发了,就连lamda表达式,async/await都是js的标配了,甚至你们从来就不肯正眼瞧瞧的Rx都是前端3大框架之一的 reactJs的核心支撑。

而这一切都是你们一直鄙视的某软最先带入主流开发的,而国内neter们到底在干啥么?
来吧,先说说MVVM把

  1. 为啥非要强调啥窗体。啥父子,啥构造,啥timer。扔掉不好么。

伪描述

  public class 采集指标
  {
           public 静态 单件采集指标  Inatance {get}
           
           public IasyncEnumerable<指标对象> 异步指标流() //这里我直接用 IasyncEnumerable异步流,下面我就省略async/await的说明了
          
  }

有这全局静态单件,你在任意地方皆可访问,不必关心啥啥窗体。啥父子,啥构造

2.为了解决这样的东西,同时为了个MVVM领域在普通net程序员里流行,某软还给了其他的东西,比如Chanel频道对象,当然在更早的时候,还给了你Rx
你上一个问题是我们移动窗口,我们来看看Rx时间移动窗口怎么弄
还是MvvM,没有啥窗口,没有啥父子,所以我直接控制台好了,免得一讨论就timer,控件去了

using System.Collections;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Threading.Channels;

//使用rx,后面有能力使用各种操作符对数据进行再加工
//我这里演示平滑移动窗口,缓存1M内数据,但是窗口平滑移动半秒,Buffer是缓存,实际上rx还有一个差不多操作符叫Window,
//原理一样,只不过一个是buffer缓存后给数据,window是按参数分割但是还是来一个给一个
//后面图表我到不希望他来一个给一个,我希望1秒刷一次,所以用buffer
采集指标.Instance.指标数据流().Buffer(TimeSpan.FromSeconds(1), TimeSpan.FromMilliseconds(500)).Subscribe(p =>
{
    Console.WriteLine($"最近1秒内数据:{string.Join(",",p.Select(c=>c.电压))}");

});


Console.ReadKey();


public class 采集指标
{
    private readonly static Lazy<采集指标> lazy = new Lazy<采集指标>(() => new 采集指标());

    private Subject<testobj> _source=new Subject<testobj>();

    

    public static 采集指标 Instance => lazy.Value;

    public 采集指标()
    {
        //你怎么从udp接收我不管了,我们直接模拟

        //模拟数据方法
        mockdata();
    }

    private void mockdata()
    {
        //模拟数据,每100ms产生一个模拟数据
        Observable.Interval(TimeSpan.FromMilliseconds(100)).Subscribe(p =>
        {

            _source.OnNext(new testobj()
            {
                电压=p
            });
        });
    }

    //我这里展示的是RX,后面的出的IAsyncEnumerator<>, Channel我就不介绍了,大同小异
    //之所以用rx其实是因为rx的操作符多点,后面有能力去做其他的事情,比如你后面图表可能需要移动窗口
    public IObservable<testobj> 指标数据流()
    {
        return _source.Publish().RefCount();
    }

   


}

public class testobj
{
    public float 电压 { get; set; }
}









子窗体对外公开构造函数,对外公开方法

timer

是不是可以新建一个类库,里面放那些数据,这样这些数据可以在所有窗体共用了