async,await,Task,Action ,Lambda的n个写法。

本文于2021年7月1日首发于博客园。

1,今天看了Task这个用法,对比了以往的Thread用法,提供了很多控制方法,使线程管理更方法简单。

2,据说Thread本质上是使用的单核,Task是由操作系统调度的多核,性能更优越。

3,看Task的时候,又顺便看到了await和async这个知识点,记录一下:

一,

说明:在M1方法中,声明了一个由框架提供的Action委托的类型action,委托指向了Fun方法。

           这个action,就是一个委托对象,我们将委托action去执行Fun方法,委托一词,由此而来,其用法,可见一斑。

            接着我们又创建了一个Task对象t,让他来执行我们的异步操作,Run就是开始执行的意思,

             紧接着我们使用await t语句,来等待t执行完毕。整个一系列的动作,又被主函数调用。

二,

说明:如上图,我们也可以这也写,省略Action的定义,直接把所要执行的耗时操作Fun,交给Task去执行。

 

三:

说明:如上图,lambda表达式出场了,Task的Run方法参数中,需要Action类型的委托实例,我们就可以使用

     lambda表达式,相比着第二种写法,第三种写法,少定义了一个方法Fun,这便是lambda表达式的好处之一。

          什么时候用lambda表达式?当参数类型需要的是委托类型时,可用lambda表达式。本例,Run的参数,需要一个Action类型的委托,所以此处可用lambda表达式。

     用lambda表达式有什么好处?可以少定义一个方法(程序复杂到一定程度,给方法起一个顾名思义的名字,也是个难事),使程序更简练,但是阅读性较差。

     什么又是匿名函数?此处的lambda表达式,就是匿名函数,顾名思义,它没有方法名字,但它仍然是一个函数(方法)。

 

四:

说明:这个更简洁,相比第三种写法,省去了定义的变量t,为什么可以省?因为Task.Run(Action)返回的就是

     Task类型,我们可以直接await Task.Run(Action)。相当于int a; a=2;这两句代码,合并成了int a=2;这一句代码。

 

五:

说明:再看一下上图中的这个写法,它在做什么?它想做什么?

            我们封装了一个带有返回值的异步方法。

            我们想从异步方法中,获取计算的结果。

            Task任务指向了Fun方法,当Fun方法执行完毕,返回M1方法,主函数从M1方法中获取值。

             值得一提的是,主函数获取异步方法的返回值时,是阻塞的,也就是说,在主函数中,

             int num = M1().Result;这句代码,是被阻塞的,直到Fun方法执行完毕,int num得到了值,主函数才会接着往下执行。

             那这不就是同步了吗?又什么意义呢?在这个例子中,当然看不到它的功效,我们可以设想这样一个小栗子:

             想要计算 11X208X190X32的结果,我们用11X208的结果,去乘190,再拿得到的结果,去乘32,这样顺序执行。

             有没有更快的方法呢?有!我们把 11X208交给一个Task去异步计算,把190X32交给另一个Task去计算,两个Task同时计算,

            同步进行,但是要等到两个Task的计算任务都结束,才能往下进行,此时主线程,就会等待两个Task的计算任务结束,拿到

    两个Task的计算结果,再相乘(主线程在等待两个Task任务结束时,两个Task也是同步进行的)。

    在这个小例子中,就可以用图五的这种方法。 感兴趣的朋友,可以试着写一下。

 

六:

 

说明:上图和图三的写法是一样的,只是多了有返回值,用上了lambda表达式,代码立马简洁了很多。

 

七:

 

说明:上图和图四的写法是一样的,只是多了有返回值,用上了lambda表达式,代码立马简洁了很多。

 

八:

 说明:上图为简化的终极写法。

 

 

 

写在后面:1,三年前,第一次接触到Socket编程,里面用到了回调,以及lambda表达式,看的我云里雾里,

                       三年后,我也可以熟练的使用委托和lambda表达式,熟练的原因,就是对业务需求的需要,没

       有业务需求,看知识点,是很难理解的,根本体会不到它的需求场景是什么。

     2,有的时候,在纠结这是不是孔乙己“回”字的四种写法,写了这么多有什么用,不都是面向需求编程,

        面向人民币编程吗?后来想想,熟能生巧,举一反三,才能有更多的思路去解决问题,才能不断的重构,也便释然了。

 

 

 

 网页查看不方便?试试在手机上看吧!关注下方公众号,好文章同步推送。

 

posted @ 2021-07-01 23:29  zch半缘修道半缘君  阅读(670)  评论(0)    收藏  举报