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

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

admin
2025年4月30日 12:35 本文热度 86
方法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