C#笔记(.Net异步编程async/await)3_Sammy爱学习的博客-程序员资料

技术标签: C#  async  Task  异步  await  Thread  

C#笔记(.Net异步编程async/await)3

最近学习了.Net下异步编程,因此有必要总结下,以后可以参考

首先我们来了解下.net下多线程的方法

关于多线程,早在.NET2.0时代,基础类库中就提供了Thread实现,.Net4.0时代推出了新的多线程模型Task.那让我们来看下两者的区别吧。

#region 多线程测试
        private static void TestThread()
        {
            Console.WriteLine("多线程测试");
            for (int i = 0; i < 50; i++)
            {
                new Thread(dorun1).Start();//多线程模式
            }

            for (int j = 0; j < 50; j++)
            {
                Task.Run(() => { dorun2(); });
            }
        }

        private static void dorun1()
        {
            Console.WriteLine("Thread线程编号为:" + Thread.CurrentThread.ManagedThreadId);
        }

        private static void dorun2()
        {
            Console.WriteLine("Task线程编号为:" + Thread.CurrentThread.ManagedThreadId);
        }
        #endregion

通过此测试代码,我们可以发现Thread显示的线程编号都是唯一的,因为每次都会创建一个新的线程来操作,但是Task方法来实现里看到线程有重复的,因为Task底层使用的事线程池,每次Task.Run()不是创建一个新的线程而是从线程池中去查询是否有空闲的线程可以用,而且处理完以后也不会立即侧小,而设置为空闲状态。这就是两者的重要区别.

接下来我们来看下重点async/await

 

简单总结:

  (1)方法签名包含一个 async 修饰符。

  (2)根据约定,异步方法的名称需要以“Async”后缀为结尾。

  (3)3 种返回类型:

    ① Task<TResult>:返回 TResult 类型。

    ② Task:没有返回值,即返回值为 void。

    ③ void:只适用于异步事件处理程序。

  (4)方法通常包含至少一个 await 表达式,该表达式标记一个点,我们可以成为悬挂点,在该点上,直到等待的异步操作完成,之后的方法才能继续执行。 与此同时,该方法将挂起,并将控制权返回到方法的调用方。

给个示例看下

#region 异步编程测试

        private static void TestAsync()
        {
            Console.WriteLine("异步编程测试");
            Task<int> value = CalAsync(5);
            //处理其他事情
            Console.WriteLine("处理其他事情");
            Console.WriteLine("A");
            Console.WriteLine("B");
            //value.Wait();//等待异步完成后进入主线程的任务 开启时C没有立即打印 关闭时C立即打印
            Console.WriteLine("C");
            Console.WriteLine("异步计算结果:{0}", value.Result);


        }

        private static async Task<int> CalAsync(int i)
        {
            Console.WriteLine("异步start");
            var result = await Task.Run(() => calculate(i));等待执行完毕
            Console.WriteLine("异步end");
            return result;
        }

        private static async Task<int> CalnewAsync(int i)
        {
            Console.WriteLine("Async Start");
            var result = Task.Run(() => Calculate(i));//执行此方法
            Console.WriteLine("Async End");
            int k = await result;//需要用到上面方法的值时等待
            return k;
        }

        private static int calculate(int i)
        {
            Thread.Sleep(2000);
            for (int j = 0; j < i; j++)
            {
                Console.WriteLine("输出的测试结果{0}", j);
            }
            return 1;
        }

        #endregion

从代码中可以发现执行结果为:

代码会先执行同步的方法,当调用calAsync异步方法时刚开始还是同步执行,判断到await关键字时进入异步方法同时将控制权放回给主方法TestAnsyc。由于主方法需要用到value.Result所以又等待calAsync异步方法执行完毕后将值打印出来。

这其中的value.wait()方法需要讲解下,如果执行此代码出现的结果是

可以看出如果执行wait()方法,同步方法执行到wait()时会等待异步方法执行完毕后继续执行主方法中的代码。

其中CalAsync和CalnewAsync两个异步方法,仔细看下有点不同,CalAsync中var result = await Task.Run(() => Calculate(i));

需要等待此方法执行完毕异步方法才会执行此方法内之后的代码,而CalnewAsync中var result = Task.Run(() => Calculate(i));其中的await放到了Console.WriteLine("Async End");这句代码之后来执行int k = await result;也就是说执行此方法后异步方法内此方法之后的代码可以继续执行直到await语句时就需要等待刚才那方法执行完毕才可以往下走,这是一点区别,实际开发中可能会用到.

通过上述讲解.net的异步编程大致概念应该就有了吧。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/sammy520/article/details/80036951

智能推荐

pip freeze requirements.txt命令迁移模块_通幽通明的博客-程序员资料

转自 我不喜欢这个世界 的《python下使用pip freeze &amp;gt;requirements.txt命令迁移模块》https://blog.csdn.net/m0_38124502/article/details/78090902当我们开发项目的时候,会用virtualenv创建 很多python独立环境,这时候就会出现在不同环境下安装相同的模块的时候, 为了避免我们通过联网下载所需模块,...

microLite裸机系统04 | microLite裸机系统之内核(Kernel)_microlite操作系统作者_microLite的博客-程序员资料

这里所谓的内核就是软件定时器,要想设计出简单易用的软件定时器,至少要做到不增加代码的耦合度

阿里imgcook--上传图片,自动生成前端结构样式_imgcook使用教程_袭人不弄的博客-程序员资料

&gt; 你是否还在为切图太慢而加班到深夜?你是否还在为css基础薄弱苦苦烦恼?你是否还在为UI改进改到头秃?&gt; 使用以下教程,让我们开开心心下班(比别人下班早),快快乐乐验收(UI细节哭了)介绍:本教程来源阿里淘系技术部,前端智能生成代码平台 imgcook以下为官网:https://www.imgcook.com/一下为使用文档:https://www....

2019-NCTF web writeup(下)_Crispr-bupt的博客-程序员资料

2019-NCTF web writeup(下)前言由于某些不可抗力因素 ,导致NCTF的平台已经关闭,还没开源,所以我只能盗用我队友的图来进行个人总结了qwq。不过知识点应该都还齐全2333。收货4.chr()拼接绕过5.preg_replace()函数/e漏洞(PHP7.0失效了qwq)6.flask的SSTI注入2019NCTF题目(下)0x05 repl...

ArcGIS教程:使用 Spatial Analyst 工具条_arcgis栅格数据生成直方图_地理国情监测云平台的博客-程序员资料

Spatial Analyst 工具条提供了两个交互式工具,可用于对数据进行简单的探究。选定的图层用于识别这两个工具所作用的栅格。

validity属性_input.validity.valid_努力鸭小丁的博客-程序员资料

(1).badInput:标识当前输入是否是无效输入,比如number控件,输入的却是字符串,true表示无效输入。(2).customError :标识当前是否是自定义验证错误信息,true表示是。(3).patternMismatch:标识输入内容是否与pattern规定的规则匹配,true表示是。(4).rangeOverflow:标识输入的数值是否超过max属性限制,true表示超过...

随便推点

【python 爬虫】识别网站所用技术_东华果汁哥的博客-程序员资料

有一个十分有用的工具可以检查网站构建的技术类型——builtwith 模块(只支持python2环境,python3环境报错)。pip install builtwith该模块将 URL 作为参数,下载该 URL 并对其进行分析,然后返回该网站使用的技术。举个例子:>>> import builtwith>>> builtwith.parse('http://xxxxxxxxxxxxxxxxxx'

Flex制作的一个Flv视频播放器_weixin_33815613的博客-程序员资料

Flex制作的一个视频播放器来播放Flv文件 转载于:https://blog.51cto.com/tianhuan/398057

程序员的生活_Satan_Z的博客-程序员资料

  如果你很幸运选择了当一个程序员,那我先恭喜你,因为你因此能获得一个收入不错的工作,能找到一个满足你生活最低需求的岗位。  如果你很不幸运选择了当一个程序员,那我们先握握手在细说,一个程序员,一天要面对电脑八小时以上,常常不停的在那张蜘蛛网上,down and up ,程序员不带眼镜的很好,有时候写累看看四周,发现白炙灯发出来的光是那么的昏暗,有空了再看看天天,才发现天空阳光是那么的刺眼。  如

Hadoop 运行 share/hadoop/mapreduce/hadoop-mapreduce-examples-xxx.jar 报错_瞧德的博客-程序员资料

今天在运行以下命令hadoop jar share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.3.jar grep input output 'dfs[a-z.]+'因为之前我改了主机名为master1报错19/03/16 16:12:59 INFO Configuration.deprecation: session.id ...

《Delphi传奇》研究系列文章1:服务端控制中心(服务器网关启动器)_delphi 传奇_xyzhan的博客-程序员资料

提示:所有的研究心得直接写在源码注释中,对照源码看注释即可学习了解传奇的流程架构。《Delphi传奇》全部源码获取可加入Delphi开发局QQ群:32422310《Delphi传奇》服务端控制中心(服务器网关启动器)源码文件夹如下:主窗体源码和注释:unit GMain;{1、procedure TfrmMain.SendGameList(Socket: TCusto...

请教txt文件如何显示_gashan9480的博客-程序员资料

小弟练习做一个电子阅读器,请教各位高手,像电子阅读这类软件,显示大量文本,是用控件(edit)还是直接画出来更好?多谢各位。

推荐文章

热门文章

相关标签