C#子线程值传到窗体控件-小结

这篇博客总结了两种在C#中将子线程的值传递到窗体控件的方法。方法1是将子线程写在主窗体的类内部,使用委托和Invoke来安全更新UI。方法2则是在单独的线程类中定义委托和事件,通过订阅事件来实现值的传递,并在窗体中响应事件更新控件。

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

最近写代码发现有两种方法可以把子线程中的值切换的主窗体的控件上。


方法1:这个方法在资源里UDP发消息中有,特点是:子线程写在主窗体的的类里面


public partial class Form1 : Form
{
        delegate void AppendStringCallback(string text);//创建委托 给窗体控件
        AppendStringCallback appendStringCallback;


         Thread receiveThread;// 线程

       public Form1()
        {
            InitializeComponent();


            appendStringCallback = new AppendStringCallback(AppendString);
        }

        

         private void AppendString(string text)//切换线程 到窗体线程给控件负值
        {
            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.Invoke(appendStringCallback, text);
                
            }
            else
            {
                richTextBox1.AppendText(text + "\r\n");
            }
        }


          private void Form1_Load(object sender, EventArgs e)
        {

              receiveThread = new Thread(new ThreadStart(ReceiveData));//启动 收信息的线程
            //将线程设为后台运行
            receiveThread.IsBackground = true;
            receiveThread.Start();

         }


         private void ReceiveData()//接受消息
        {

           string str="";

            while (true)
            {
                try
                {

                       //----------------------------

                       这里是线程中要添加的东西

                       //----------------------------
                        AppendString(str);//把线程要传给控件的值传到控件里
                       
                }
                catch(Exception ex)
                {
                    //退出循环,结束线程
                    MessageBox.Show(ex.Message);
                    break;
                }

            }
        }

}


方法2:在之前的博客“c#线程-线程间发消息-线程给窗体传值”中有过介绍,特点是子线程写在了单独的类中


线程类:

using System.Threading;
using System.Runtime.InteropServices//这个是用来引用dll的

 

namespace cmp
{
    public delegate void CardReadHandler(string param);//建了个委托


    public class CardReader
    {

        public Thread thread1 = new Thread(new ThreadStart(ReadKA));//线程


        private static CardReadHandler onCardRead;//委托

        public event CardReadHandler CardRead//一个事件
        {
            add { onCardRead += new CardReadHandler(value); }
            remove { onCardRead -= new CardReadHandler(value); }
        }


        protected static void ReadKA()//线程处理函数
        {

            while (1 == 1)
            {

                 string str="";

                 //----------------------------

                  这里是线程中要添加的东西

                  //----------------------------

                 onCardRead(str);//把要传到主窗体的值,从这里传走
                        

            }


        }
    }
}


在form窗体里:

 

namespace cmp
{
    public partial class gjcmp : Form
    {
        private static string ka_id = "";
        public gjcmp()
        {
            InitializeComponent();

            //线程 
            CardReader cd = new CardReader();
            cd.CardRead += this.OnCardRead;//这两行要写上去调上面线程的事件
        }

        //线程返回的卡id
        private void OnCardRead(string param)//上面写的线程会不断给这个方法传值,所以操作写在这里
        {
                ka_id = param;//线程类传过来的值
                object[] pList = { this, System.EventArgs.Empty };
                label1.BeginInvoke(new System.EventHandler(UpdateUI), pList);//这两行是还切换线程的,这样就可以给当前线程的控件传值了          

        }

        //切换线程 
        private void UpdateUI(object o, System.EventArgs e)
        {
                                label1.Text = ka_id;
        }
         

  }

}


 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值