天天看点

跨线程中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"

;之类的则完全可以使用匿名方法。

    最后,漂亮的方法莫过于考虑周全而且足够简洁,一个工作函数除了支持跨线程的同时还能支持普通调用,则更好了,只需要检查当前窗体的

  1. public

    void

     DoWork()

  2.         {
  3. if

     (

    .InvokeRequired)

  4.             {
  5.                 Invoke(

    new

     System.Windows.Forms.MethodInvoker(DoWork));

  6.             }
  7. else
  8.                 button1.Enabled = 

    true

    ;

  9.         }
  1.  DoWork2()
  2.             Invoke(

     System.Windows.Forms.MethodInvoker(

    delegate

    () {

  3. .button1.Enabled = 
  4.             }));

继续阅读