C#在代码里刷新界面的两种方法(防止多线程制约)

本文分享了两种在多线程环境下更新UI的有效方法:一是通过Timer控件作为中间人,实现控件间的对话;二是利用委托进行跨线程操作,以解决不同线程间直接修改UI控件的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在跑数据时,有时候需要把跑出来的数据反应到窗体上,如果直接改窗体,多半会遇到多制程制约的情况。所以总结了以下两种方法。

一、控件与控件的对话

在窗体上先拖一个timer控件。这个控件将会和你要改变的控件发生对话,这样不再是不同线程了,找了一个中间人,哈哈。

1、在初始化代码里添加

        public MainForm()
		{
			InitializeComponent();
            // 以下三行,根据实际改参数
            timer1.Enabled = true;
            timer1.Interval = 3000;
            timer1.Start();
        }

接下来,写tick事件了,也就是你要实现的功能,这样一来,控件和控件都是一个公司的,容易说话,一句话就把事办了。

      private void timer1_Tick(object sender, EventArgs e)
        {
                label8.Text = fileNmList[0]; //此处给控件赋值
        }

二、做一个委托,代理你去办事

声明:基础代码来自https://blog.csdn.net/lymsyh/article/details/80102815  我要完善一下。

      // 声明一个委托,以准备跨线程修改UI的属性
        public delegate void RefreshUI(Control c, object o);
        public void refreshUI(Control C, Object o)
        {
            // 这里可以强转任意控件,然后改他们的方法,参数o也可以是任意复杂结构类型,只要你封装好,拆封好就OK
            ((ListBox)C).Items.Add (o.ToString());
        }

当你要使用这个委托时,也很简单。

this.Invoke(new RefreshUI(refreshUI), new object[] { listBox1, nowtime + "--->" + neirong });

这里举例是向一个列表框里不停的增加值,也可以其他的控件,这是一个简单的委托,对委托头疼的同学,可以通过类似简单的委托,向纵深开展学习,委托并不可怕,哈哈。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值