LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

【C#】Winform程序Task跨线程访问控件

admin
2025年4月30日 12:35 本文热度 1436
方法1-控件对象.Invoke(Action<>,参数),同步执行卡UI

Invoke 是同步的,它会阻塞调用线程,直到目标线程(创建控件的线程)完成所请求的操作。这意味着调用 Invoke 后,当前线程会等待,直到 UI 线程执行完指定的方法。

方法2-控件对象.BeginInvoke(Action<>,参数),异步执行不卡UI

BeginInvoke 是异步的,它会将操作放入 UI 线程的消息队列中,然后立即返回,不会阻塞调用线程。这使得调用线程可以继续执行其他操作,而无需等待 UI 更新完成。

方法3-Invoke((MethodInvoker)delegate

MethodInvoker 是一个无参数、无返回值的委托类型,用于表示可以被调用的方法在多线程编程中,特别是在 Windows 窗体应用程序中,MethodInvoker 常用于安全地更新 UI 控件,它可以被用作给 Invoke 和 BeginInvoke 方法传递的委托。

案例:分别使用以上三种方法进行跨线程访问操作。



namespace _018_跨线程访问控件方法
{
    public partial class 跨线程访问控件方法 : Form
    {
        public 跨线程访问控件方法()
        {
            InitializeComponent();
            //方法1:不推荐
            //Control.CheckForIllegalCrossThreadCalls=false;
        }
        //方法2-控件对象.Invoke(Action<>,参数)
        private void bt1_Click(object sender, EventArgs e)
        {           
            Task t1 = Task.Run(() =>
            {
                for (int i = 1; i < 100; i++)
                {
                    Thread.Sleep(500);
                    //True则表示与当前线程不在同一个线程中
                    if (this.txtBox1.InvokeRequired)
                    {
                        //使用Invoke方法进行传递数据,Action有参数string类型,st表示要传的参数,无返回值
                        //有返回值的要使用Func
                        //Invoket同步执行,会卡UI
                        this.txtBox1.Invoke(new Action<string>((st) =>
                        {
                            this.txtBox1.Text = st;
                        }), i.ToString());//将要传递的参数写到Lambda表达式后面,即将i的值传递给(st)
                    }
                }               
            });
        }
        //方法3-控件对象.BeginInvoke(Action<>,参数)
        private void bt2_Click(object sender, EventArgs e)
        {
            Task.Run(() =>
            {
                for(int i = 1;i < 100; i++)
                {
                    Thread.Sleep(1000);
                    //True则表示与当前线程不在同一个线程中
                    if (this.txtBox2.InvokeRequired)
                    {
                        //使用BeginInvoke方法进行传递数据,Action有参数string类型,st表示要传的参数,无返回值
                        //有返回值的要使用Func
                        //BeginInvoket异步执行,不会卡UI
                        this.txtBox2.BeginInvoke(new Action<string>((st) =>
                        {
                            this.txtBox2.Text += st+"、";
                            //this.txtBox3.Text += st + "、";//每个值后面+顿号
                        }),i.ToString());//将要传递的参数写到Lambda表达式后面,即将i的值传递给(st)
                    }
                }
            });
        }
        //方法4-Invoke((MethodInvoker)delegate
        //MethodInvoker 是一个无参数、无返回值的委托类型,用于表示可以被调用的方法
        //在多线程编程中,特别是在 Windows 窗体应用程序中,MethodInvoker 常用于安全地更新 UI 控件,
        //它可以被用作给 Invoke 和 BeginInvoke 方法传递的委托。
        private void bt3_Click(object sender, EventArgs e)
        {
            Task.Run(() => 
            {
                for (int i = 0; i < 100; i++)
                {
                    Thread.Sleep(1000);
                    //True则表示与当前线程不在同一个线程中,判断多个控件
                    if (this.txtBox3.InvokeRequired|| this.txtBox3.InvokeRequired)
                    {
                        Invoke((MethodInvoker)delegate
                        {
                            this.txtBox3.Text = i.ToString();
                            this.txtBox4.Text = i.ToString();
                        });
                    }
                }               
            });
        }       
    }
}

该文章在 2025/4/30 14:56:47 编辑过
关键字查询
相关文章
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved