zoukankan      html  css  js  c++  java
  • C# Thread Lambda

    使用匿名委托,Lambda简化多线程代码

    理解C#中的Lambda表达式

    ====================================

    先来看两段C#代码,来比较Lambda表达式:

    Thread t = new Thread(() =>   {   

    AddIt AddDelegate = new AddIt(AddItem);   

    this.Invoke(AddDelegate);   });   

    Thread t3 = new Thread(new ThreadStart(() =>   {   

    AddIt AddDelegate = new AddIt(AddItem);  

     this.Invoke(AddDelegate);   

    }));   

    这两种写法都是可以的,出来的IL也一样,但是意义是不同的,后者相当于匿名方法,前者

    更像是"匿名"的委托,其实这样写:

    Thread t2 = new Thread(() =>   {   

    this.Invoke(new AddIt(() => {

     this.listBox1.Items.Add("bbb"); 

    }));  

     });   

    这个跟上面两种写法也是一样的效果,初次接触的时候,可能大家跟我一样会有些迷茫,Lamdba表达式到底该怎么用呢?

    首先还是要弄清Lamdba表达式的几个特性:

    1. Lamdba 表达式是一个委托类型:

    MethodInvoker invoker = () => { Console.WriteLine(); };  //is actually equal to the following form.    MethodInvoker invoker = delegate() { Console.WriteLine(); };  //这里是Lamdba 表达式的匿名委托的用法  

    2. Lamdba 表达式可以用作匿名方法

    MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });   //相当于:    MethodInvoker invoker = new MethodInvoker(MyFunc);    partial void MyFunc()    {      Console.WriteLine();    }  

    我们知道, 当构造一个新的委托的时候, 他的构造器需要一个函数指针作参数,这个函数指针是委托类型的

    实际上,当我们这样去new 一个委托的时候:

    MethodInvoker invoker = new MethodInvoker(MyFunc);

    "MyFunc" 就是一个委托,而不只是一个函数名的存在. 编译器将为这个构造函数生成一个匿名委托:

    MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });

    可以这样理解编译器的行为: 匿名方法其实也就是委托。

    那么为什么我们可以这么写呢:

    MethodInvoker invoker = () => { Console.WriteLine(); };

    我们来看一看:

    首先,这个委托的构造器需要一个委托参数,所以通常我们得这样写:

    MethodInvoker invoker = new MethodInvoker(delegate() { MyFunc(); });

    但是匿名的delegate 可以转化成函数指针 (void() target):

    所以这样写是可以的:

    MethodInvoker invoker = new MethodInvoker(MyFunc);  //而匿名的委托又可以描述为Lambda表达式 MethodInvoker invoker = new MethodInvoker(() => { Console.WriteLine(); });  //另外一方面,由于编译器对"宽松委托"的支持, MethodInvoker类委托可以转化成匿名类委托:    MethodInvoker invoker = delegate() { Console.WriteLine(); };  //而匿名的委托又可以用Lambda表达式来描述    MethodInvoker invoker = () => { Console.WriteLine(); };  

    从上面,我们可以看到一个复杂的委托是如何转化成简洁的Lambda表达式的。这对程序员来说无疑又是提高生产力的一个体现!

  • 相关阅读:
    【重要】攻击动作时间段判断~使用动画time比较动画length和使用一个变量数组做延迟
    角色头上冒数字
    ApplicationListener接口的生命周期
    Blender软件基本介绍(3D建模软件)
    unity中给图片换颜色
    Unity中建立文本保存数据
    UGUI脚本添加Btn回调的方法
    碰撞体速度过快穿透的问题
    Unity中的点击,长按,划动
    在对话系统中实现打字机效果
  • 原文地址:https://www.cnblogs.com/yuanws/p/2196121.html
Copyright © 2011-2022 走看看