Lambda表达式妙用

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

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

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

05171810_hh30.gif 一般解法
 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表达式的解法

05171810_hh30.gif 简化后的解法
 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  }

 

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

转载于:https://my.oschina.net/newsherlock/blog/425425

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值