zoukankan      html  css  js  c++  java
  • 跨线程中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.         }
  • 相关阅读:
    2012 Multi-University Training Contest 8
    uva 11354最小生成树瓶颈路(lca算法实现)(rmq在多校二中有一道题)
    POJ 3164最小树形图
    uva11865 二分+最小树形图(朱刘算法)
    LA 5717枚举+最小生成树回路性质
    2014/3/9 长沙多校(第二次)
    zoj3759(待解决+算法木有问题+but需要java大数)
    ztr loves lucky numbers--hdu5676(DFS)
    C. Nearest vectors--cf598C(极角排序)
    D. Spongebob and Squares--cf599D(数学)
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6204862.html
Copyright © 2011-2022 走看看