c#中控件的Invoke、BeginInvoke的区别

控件的.Control.Invoke 和BeginInvoke方法都是在UI线程执行控件操作,主要用途是让子线程可以跨线程操作UI线程的控件,区别如下:

1.Control.Invoke 和Control.BeginInvoke 如果在拥有该控件的UI线程上执行耗时控件操作区别不大,一样会堵塞UI线程。原因如下:Control.Invoke 是同步操作,直接堵塞,直到控件操作完成才继续向下执行,而control.BeginInvoke 异步执行,虽然会生成一个子线程执行控件操作,但是子线程又会回到UI线程来操作控件,绕了一圈又回来了,同样导致UI线程堵塞。

2…Control.Invoke 和Control.BeginInvoke 如果在子线程上执行控件操作,同样也会导致UI线程堵塞,原因是都要在UI线程上执行控件操作。区别在于Control.Invoke会导致子线程也堵塞,而conntrol.BeginInvoke 不会堵塞子线程。

3.在UI线程上使用Control.Invoke 和BeginInvoke与直接调用方法区别不大,但在子线程上使用Control.Invoke 和BeginInvoke方法可以跨线程操作控件。在子线程如果想串行执行语句使用Control.Invoke,并行执行使用BeginInvoke。

4.如果不想堵塞UI线程,即避免界面卡死,应把耗时操作在子线程中完成,然后到UI线程更新一下控件。正确的做法是将工作线程中涉及更新界面的代码封装为一个方法,通过 Invoke 或者 BeginInvoke 去调用,两者的区别就是一个导致工作线程等待,而另外一个则不会。

5.无论如何操作其实都是使 UI 线程的负担不至于太大,因为界面的正确更新始终要通过 UI 线程去做,我们要做的事情是在工作线程中包揽大部分的运算,而将对纯粹的界面更新放到 UI 线程中去做,这样也就达到了减轻 UI 线程负担的目的了。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值