Lambda表达式妙用
2023-02-18 16:38:17 时间
其实我们应该一直很熟悉委托、匿名方法、Lambda表达式的关系的,作用差不多,写法却越来越简单,当然相互之间却不能完全代替的。今天研究了一下Lambda表达式的替换。
要求建立一个winform窗体,拖一Button控件,点击Button,执行一个耗时操作(用多线程),耗时操作结束后,在窗体上显示结束信息。
要求很简洁,解法也很简单。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.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 }
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表达式的解法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.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 }
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 }
是不是比第一个简单多了呢?呵呵
相关文章
- CodeArts TestPlan:一站式测试管理平台
- cookie、session,、token,还在傻傻分不清?
- 一文了解华为FusionInsight MRS HBase的集群隔离方案RSGroup
- 高并发环境下构建缓存服务,你需要注意这6点
- 一文详解RocketMQ的存储模型
- Serverless时代的微服务开发指南:华为云提出七大实践新标准
- 用100W+行代码贡献经验,带你了解如何参与OpenHarmony开源
- CSV:简单格式下隐藏的那些坑
- 能将三次握手讲到这个程度,不给你offer给谁!
- 细数华为云云原生产品及五大开源实践
- 解密秒杀系统架构:不是所有的秒杀都是秒杀
- 《迷你世界》亿级玩家都在用的游戏场景推荐系统长啥样?
- ROMA Connect: 5大联接能力+4大集成能力,推进企业数字化转型
- DTT年度收官圆桌π,华为云8位技术专家的年末盘点
- 工业数据分析为什么要用FusionInsight MRS IoTDB?
- 云网络运维必备神器:全链路故障诊断与分析
- 掌握这5大功能,解锁鲲鹏开发新发现
- 华为云助推武水集团项目成功入选住建部“智慧水务”典型案例!
- 数字化时代,校园生活还可以这样过
- 管理有方!华为云数据库为医药行业管理加速