如何跨线程访问Winform中的UI元素
阅读原文时间:2023年07月08日阅读:2

如何跨线程访问Winform中的UI元素

假如制作一个Socket聊天应用程序,很可能会用到多线程;

例如为Receive方法开辟单独一个线程,例如为Receive方法开辟单独一个线程(后台运行的线程IsBackGround=true);

然而Winform的UI控件都是运行在主线程中的,如果从其他线程直接访问UI控件,系统就会报错;

        public void Show(string s)
        {
            listBox1.Items.Add(s);
        }

那么如何才能在其他线程访问主线程,并且向UI控件传递数据呢?

有两种方法可以选择:

一、用BeginInvoke

        public void ShowMessage(string message)
        {
            BeginInvoke(new Action<string>((msg) => listBox1.Items.Add(msg)), new object[] { message });

        }

二、用委托

        //声明委托
        public delegate void ShowMsg(string s);

        //委托要绑定的方法
        public void Show(string s)
        {
            listBox1.Items.Add(s);
        }

        //在多线程中调用的方法,不会报错的方法
        public void ShowMessage(string message)
        {
            //实例化委托,并绑定方法
            ShowMsg OnShowMsg = new ShowMsg(Show);
            //如果是跨线程的执行if代码块
            if (this.InvokeRequired)
            {
                this.Invoke(OnShowMsg, message);
            }
            //如果不是跨线程的,执行else代码块
            else
            {
                Show(message);
            }
        }