跨线程中Control.Invoke的优雅写法

大家都知道.Net2.0开始的Control.CheckForIllegalCrossThreadCalls默认为True,这样是为了引导用户不要随便跨线程设置控件状态。当然如果是很简单的线程控制也可以自己把这个属性设为False然后像1.x那样直接写代码。大部分情况下还是推荐大家用Invoke方法,当然这个会涉及到一个delegate的问题导致代码多很多而且不方便阅读。其实自己注意代码质量的话也可以把这个事情做得很漂亮。下面推荐两个Invoke的写法。
    首先,有关delegate的申明,这个可以简化到自己不用去做,最常见的Invoke函数调用的工作函数其实都是没有参数的,这时可以使用

System.Windows.Forms.MethodInvoker,如果需要用到Sender之类的指针,可以使用

System.EventHandler,另外系统还有范型的委托定义比如System.Action之类的可以考虑。
    其次,如果工作函数足够简单,比如只有一句类似

this.Text="jinjazz";之类的则完全可以使用匿名方法。
    最后,漂亮的方法莫过于考虑周全而且足够简洁,一个工作函数除了支持跨线程的同时还能支持普通调用,则更好了,只需要检查当前窗体的

InvokeRequired属性就行了。
    
    
    下面给两段代码可以参考一下,其中第二段使用了匿名代码,这是一个足够简单的需求下的代码写法,而大部分工作中应该多使用第一段的写法

推荐而且通用的写法

  1.         public void DoWork()
  2.         {
  3.             if (this.InvokeRequired)
  4.             {
  5.                 Invoke(new System.Windows.Forms.MethodInvoker(DoWork));
  6.             }
  7.             else
  8.             {
  9.                 button1.Enabled = true;
  10.             }
  11.         }

匿名方法

  1. public void DoWork2()
  2.         {
  3.             Invoke(new System.Windows.Forms.MethodInvoker(delegate() {
  4.                 this.button1.Enabled = true;
  5.             }));
  6.         }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值