winform 非主线程访问控件异常

知识点:

1、委托是实现回调函数的一种机制

2、委托是用户自定义类型,可以当作变量一样进行传递

3、回调函数就是把一个方法(方法的地址)传递给另一个方法去执行。 


需求:通过后台代码修改控件显示内容(修改控件的其他属性,方法类似)。


方法1

前台界面

后台代码及运行结果

 

方法2

发生异常:非主线程不能直接修改UI线程创建的控件的属性。

方法3


        private void Form1_Load(object sender, EventArgs e)
        { 
            /*
             *获取或设置一个值,该值指示是否捕获对错误线程的调用,
             *这些调用在调试应用程序时访问控件的 System.Windows.Forms.Control.Handle 属性。 
             */
            System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false; 


            Thread thread = new Thread(DefaultMessageMethod);
            thread.Start(); 
        }

  

        void DefaultMessageMethod()
        {
            this.textBox1.Text = "Hello World";
        }

 

方法4

使用委托

        delegate void ShowDlgt();

        void DefaultMessageMethod()
        {
            this.textBox1.Text = "Hello World";
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            ShowDlgt show = new ShowDlgt(DefaultMessageMethod);
            show();
        }

 

方法4

使用回调

        delegate void ShowDlgt();//定义

        ShowDlgt show;//声明 

        void DefaultMessageMethod()
        {
            this.textBox1.Text = "Hello World";
        }

        void CFun()
        {
            show = new ShowDlgt(DefaultMessageMethod);//实例化回调

            this.textBox1.Invoke(show);
        }

        private void Form1_Load(object sender, EventArgs e)
        { 
            Thread thread = new Thread(CFun);
            thread.Start();
        }

 方法5

给回调方法传入参数


        //定义
        delegate void ShowDlgt();
        delegate void ShowParameterDlg(string msg);

        //声明 
        ShowDlgt show;
        ShowParameterDlg showPar;

        void DefaultMessageMethod()
        {
            this.textBox1.Text = "Hello World";
        } 
        void ParameterMessageMethod(string msg)
        {
            this.textBox1.Text = msg;
        }


        void CFun()
        {
            show = new ShowDlgt(DefaultMessageMethod);//实例化回调 
            this.textBox1.Invoke(show); 
        }
        void DFun()
        {
            showPar = new ShowParameterDlg(ParameterMessageMethod);//实例化回调
            this.textBox1.Invoke(showPar, "OK");
        }


        private void Form1_Load(object sender, EventArgs e)
        {
            //Thread thread = new Thread(CFun);
            Thread thread = new Thread(DFun);
            thread.Start();
        }

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值