文档章节

Lambda表达式妙用

IT周见智
 IT周见智
发布于 2015/06/05 17:18
字数 525
阅读 2
收藏 1

      其实我们应该一直很熟悉委托、匿名方法、Lambda表达式的关系的,作用差不多,写法却越来越简单,当然相互之间却不能完全代替的。今天研究了一下Lambda表达式的替换。

      要求建立一个winform窗体,拖一Button控件,点击Button,执行一个耗时操作(用多线程),耗时操作结束后,在窗体上显示结束信息。

要求很简洁,解法也很简单。

一般解法
 1  // ………………
 2  using  System.Threading;
 3  namespace  WindowsFormsApplication1
 4  {
 5       public   partial   class  Form1 : Form
 6      {
 7           public  Form1()
 8          {
 9              InitializeComponent();
10          }
11 
12           /// 耗时操作
13           private   string  Work()
14          {
15               /// 1
16              Thread.Sleep( 20 * 1000 );
17               return   " 耗时操作结束! " ; // 耗时操作结束,返回结束信息
18          }
19          
20           /// 封装耗时操作的委托
21            delegate   string  WorkDelegate();
22 
23           /// 委托变量
24          WorkDelegate myDelegate;
25 
26           /// 点击button事件
27           private   void  Button1_Click( object  sender,EventArgs e)
28          {
29               /// 2
30              myDelegate = new  WorkDelegate(Work);
31              myDelegate.BeginInvoke( new  AsyncCallBack(EndWork), null ); // 异步开始调用委托
32          }
33          
34           /// 回调
35           private   void  EndWork(IAsyncResult ar)
36          {
37               /// 3
38               string  result = myDelegate.EndInvoke(ar); // 结束异步委托调用
39               this .Invoke( new  Action < string > (Single),result); // 这里注意,Button控件不在该线程,需要用Control.Invoke方法
40          }
41 
42           /// 耗时操作结束后,显示信息
43            private   void  Single( string  msg)
44          {
45               this .Button1.Text = msg; // 将信息显示在Button1上
46          }
47 
48 
49          /// 1和3属于同一线程,2属于主线程,Button1属于主线程,所以在3处更改控件属性需要用Invoke
50      }
51  }

 

现在看一下用Lamnda表达式的解法

简化后的解法
 1  // ……
 2  using  System.Threading;
 3  namespace  WindowsFormsApplication1
 4  {
 5       public   partial   class  Form1 : Form
 6      {
 7           public  Form1()
 8          {
 9              InitializeComponent();
10              Debug.Listeners.Add( new  ConsoleTraceListener());
11          }
12 
13           /// 点击Button1
14           private   void  Button1_Click( object  sender,EventArgs e)
15          {
16              Func < string >  myDelegate = () => {Thread.Sleep( 20 * 1000 ); return   " 耗时操作结束! " ;}; // 直接用Lambda表达式代替New委托
17              myDelegate.BeginInvoke((IAsyncResult ar) => { string  re = myDelegate.EndInvoke(ar); this .Invoke( new  Action < string > (Single),re );}); // Lambda表达式代替委托
18          }
19          
20 
21           private   void  Single( string  msg)
22          {
23                this .Button1.Text = msg;
24          }
25      }
26  }

 

是不是比第一个简单多了呢?呵呵

© 著作权归作者所有

共有 人打赏支持
IT周见智

IT周见智

粉丝 10
博文 61
码字总数 185891
作品 0
西青
Hackerrank,join与split空格妙用

Problem Statement You are given a string S. Your task is to capitalize each word of S. Input Format A single line of input containing the string, S. Constraints 0<len(S)<1000 Th......

zpengseu
2015/12/07
28
0
C# Lambda表达式详解,及Lambda表达式树的创建

  最近由于项目需要,刚刚学完了Action委托和Func委托,发现学完了委托就必须学习lambda表达式,委托和Lambda表达式联合起来,才能充分的体现委托的便利、才能使代码更加简介、优雅。 Lamb...

雲霏霏
2014/07/15
0
0
C# Lambda表达式

每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默。...

天才小龙
01/05
0
0
python中lambda表达式学习

lambda只是一个表达式,函数体比def简单很多。 lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。 lambda表达式是起到一个函数速写的作用。允许在代...

Nob
2014/05/07
0
0
【C++11】lambda 表达式解析

C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看。本文作为 5 月的最后一篇博客,将介绍 C++11 的 lambda 表达式。 ...

筱骏
2017/03/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
34分钟前
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
0
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
1
0
设计模式之五 责任链模式(Chain of Responsibility)

一. 场景 相信我们都有过这样的经历; 我们去职能部门办理一个事情,先去了A部门,到了地方被告知这件事情由B部门处理; 当我们到了B部门的时候,又被告知这件事情已经移交给了C部门处理; ...

JackieRiver
今天
1
0
Android中的设计模式之命令模式

参考 《设计模式:可复用面向对象软件的基础 》5.2 Command 命令 对象行为型模式 《Android源码设计模式解析与实战》第11章 让程序畅通执行--命令模式 意图 将一个请求封装为一个对象,从而使...

newtrek
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部