C#Invoke和BeginInvoke应用详解

本文深入讲解C#中Invoke方法的原理及其应用场景,包括解决跨线程访问问题、委托机制及Invoke与BeginInvoke的区别,并附带具体示例代码。

最近,在研究Invoke的使用,但是真的是一头雾水,网上看了很多资料,感觉还是看不懂,因为对于入门级的小白,想像不出Invoke的应用场景,更谈不上如何用了?

1、Invoke到底是什么?

Invoke的本质只是一个方法,方法一定是要通过对象来调用的。

一般来说,Invoke其实用法只有两种情况:

  • Control的Invoke
  • Delegate的Invoke

也就是说,Invoke前面要么是一个控件,要么是一个委托对象

2、什么时候用Invoke

2.1 Control的Invoke

Control的Invoke一般用于解决跨线程访问的问题,比如你想操作一个按钮button,你就要用button.Invoke,你想操作一个文本label,你就要用label.Invoke,但是大家会发现很麻烦,如果我想既操作button,又操作label,能不能写在一起呢?当然可以。
我们知道,主窗体是一个Form,Form自然也是继承Control的,所以Form也有Invoke的方法,可以直接调用Form.Invoke,这就是我们常见的this.Invoke。
这就是为什么有的Invoke前面啥都没有的问题,其实前面是this,只不过省略了。

2.2 Delegate的Invoke

Delegate的Invoke其实就是从线程池中调用委托方法执行,Invoke是同步的方式,会卡住调用它的UI线程。很抽象吧。

3、实验

我们来做个简单的实验。

3.1 新建一个From ,来个Button,我想实现的功能是,点击Button时, Button 变成Disable,并开始显示计算1到8(每隔1秒加1),加到8后,跳出循环,然后把Button Enable,很简单吧。

小事情拉,于是开始行动,很快就搞定了,代码如下:

namespace InvokeTest1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Butten 点击事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAddFunction_Click_1(object sender, EventArgs e)
        {
            btnAddFunction.Enabled = false;
            for (int i = 1; i < 8; i++)
            {
                btnAddFunction.Text = i.ToString();
                Thread.Sleep(1000);
            }
            btnAddFunction.Text = "点击开始运行";
            btnAddFunction.Enabled = true;
        }
    }
}

开始运行,点击Button,控件是变成Disable,但是没有实现计数呀,而是一直就这样停止8秒,就像被卡住了一样。

 8秒后,Button控件直接变成Enable。没有1---8出现,逻辑不对啊,怎么回事?????

原因:直接主线程休眠是达不到效果的,此时桌面还处于假死状态,更新不了text值。代码放在了UI线程执行,阻塞了UI的显示

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值