【笔记】记一次.net语法await和async的异步编程实验与笔记。
2.foreach使用ef操作,使用方式注意:
List<string> l1 = new List<string>();
l1.Add("");
l1.Add("");
l1.Add("");
l1.Add(""); foreach (var ss in l1)
{
User models = await repo.GetAll<User>().SingleOrDefaultAsync(x => x.Account == ss);
}
//l1.ToList().ForEach(q=>{
// User models = await repo.GetAll<User>().SingleOrDefaultAsync(x => x.Account == q);
//});//这样写会报上下文不能被不同线程访问的异常
1.实践代码全记录:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace await_测试
{
class Program
{
static void Main(string[] args)
{
testc();
Console.Read();
} //async具有僵尸病毒般的传染性,async 会感染周围的代码,直到顶层。其实我们只需要顺其自然,让所有代码都传染上异步特性即可。
//如果我们使用Task.Wait 或者Task.Result去试图阻塞async 的传播,往往便会自找苦吃。
//这个往往是刚接触async 异步的人最容易犯的错误,这样往往会导致死锁。互相等待。
static async void testc()
{ ////----写法1.
//Stopwatch sw = new Stopwatch();
//sw.Start();
//var d1 = delay10();//立刻执行,等待取回结果
//var d2 = delay20();//立刻执行,等待取回结果
//var d3 = delay30();//立刻执行,等待取回结果
////依次取结果,取结果时间很短
//await d1;// 单条语句的确没有意义,但类似本场景多条语句的话,异步并发执行的优势就出来了。总耗时是最长耗时的那个值。
//await d2;// 第一个执行完,取不取结果是另一回事。
//await d3;// 并发执行,【2】需要获得值的时候,禁用Task.Wait or Task.Result 用 await,防止 异常信息以及防止死锁
//sw.Stop();
//Console.WriteLine("结束");
//Console.WriteLine("耗时:" + sw.ElapsedMilliseconds);
////结论:互不影响,同时进行,耗时约25秒 //----写法11.
Stopwatch sw = new Stopwatch();
sw.Start();
var d1 = delay10();//立刻执行,等待取回结果
var d2 = delay20();//立刻执行,等待取回结果
var d3 = delay30();//立刻执行,等待取回结果
//依次取结果,取结果时间很短
Console.WriteLine( d1.Result);// 单条语句的确没有意义,但类似本场景多条语句的话,异步并发执行的优势就出来了。总耗时是最长耗时的那个值。
Console.WriteLine( d2.Result);// 第一个执行完,取不取结果是另一回事。
Console.WriteLine( d3.Result);// 并发执行,【2】需要获得值的时候,禁用Task.Wait or Task.Result 用 await,防止 异常信息以及防止死锁
sw.Stop();
Console.WriteLine("结束");
Console.WriteLine("耗时:" + sw.ElapsedMilliseconds);
//结论:互不影响,同时进行,耗时约25秒 ////----写法2.
//Stopwatch sw = new Stopwatch();
//sw.Start();
//await delay10();//线性执行,线性取回结果
//await delay20();//线性执行,线性取回结果
//await delay30();//线性执行,线性取回结果
//sw.Stop();
//Console.WriteLine("耗时:" + sw.ElapsedMilliseconds);
////结论:耗时是43秒,线性按行执行,总耗时大于三个线程耗时之和。 ////----写法3.
//Stopwatch sw = new Stopwatch();
//sw.Start();
//Task t1 = delay10();//立刻执行,
//Task t2= delay20(); //立刻执行,
//Task t3 = delay30();//立刻执行,
//Task[] tk = { t1, t2, t3 };
//await Task.WhenAll(tk); //sw.Stop();
//Console.WriteLine("耗时:" + sw.ElapsedMilliseconds);
//////结论:互不影响,同时进行,耗时约25秒 //----写法4.
//Stopwatch sw = new Stopwatch();
//sw.Start();
//Task t1 = delay10();//立刻执行,
//Task t2 = delay20(); //立刻执行,
//Task t3 = delay30();//立刻执行,
//Task[] tk = { t1, t2, t3 };
//Task.WaitAll(tk);
//注意:【1】需要等待所有任务完成 禁用Task.WaitAll 用 await Task.WhenAll,防止 异常信息以及防止死锁
//http://www.cnblogs.com/bnbqian/p/4513192.html
//sw.Stop();
//Console.WriteLine("耗时:" + sw.ElapsedMilliseconds);
//////结论:互不影响,同时进行,耗时约25秒 ////总结: 进化过程:Thread+线程同步信号量 -> Task -> async&await } static async Task<string> delay10()
{
Task<string> t = new Task<string>(() =>
{
Thread.Sleep();//小失误。需要等待请用:Task.Delay(),禁用Thread.Sleep,防止 异常信息以及防止死锁
return "";
});
t.Start();
string tr = await t;
return tr;// Console.WriteLine(tr);
} static async Task<string> delay20()
{
Task<string> t = new Task<string>(() => { Thread.Sleep(); return ""; });
t.Start();
string tr = await t;
return tr;// Console.WriteLine(tr);
} static async Task<string> delay30()
{
Task<string> t = new Task<string>(() => { Thread.Sleep(); return ""; });
t.Start();
string tr = await t;
return tr;// Console.WriteLine(tr);
}
}
}
2.实践笔记:
1.无论方法是同步还是异步都可以用async关键字来进行标识,因为用async标识只是显示表明在该方法内可能会用到await关键字使其变为异步方法,而且将该异步方法进行了明确的划分,只有用了await关键字时才是异步操作,其余一并为同步操作。
2.当用async标识方法时只是显示告诉编译器在该方法中await关键字可能会被用到,当执行到await关键字开始处于挂起的状态知道异步动作执行完成才恢复。
3.用async标识方法并不会影响方法运行完成是否是同步或者异步,相反,它能够将方法划分成多块,有可能有些在异步中运行,以至于这些方法是异步完成的,而划分异步和同步方法的边界就是使用await关键字。也就是说如果在方法中未用到await关键字时则该方法就是一整块没有所谓的划分,会在同步中运行,在同步中完成。
【笔记】记一次.net语法await和async的异步编程实验与笔记。的更多相关文章
- C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别
C#语法——泛型的多种应用 本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...
- C#语法——await与async的正确打开方式
C#5.0推出了新语法,await与async,但相信大家还是很少使用它们.关于await与async有很多文章讲解,但有没有这样一种感觉,你看完后,总感觉这东西很不错,但用的时候,总是想不起来,或者 ...
- .NET4.5新特性async和await修饰符实现异步编程
开篇 每一个版本的.net都会引入一些新的特性,这些特性方便开发人员能够快速实现一些功能.虽然.net版本一直在更新,但是新版本对旧版本的程序都是兼容的,在这一点上微软做的还是非常好的.每次学一个新内 ...
- async和await是如何实现异步编程?
目录 异步编程样例 样例解析 浅谈Promise如何实现异步执行 参考 1.异步编程样例 样例: // 等待执行函数 function sleep(timeout) { return new Prom ...
- 《C#并发编程经典实例》学习笔记—异步编程关键字 Async和Await
C# 5.0 推出async和await,最早是.NET Framework 4.5引入,可以在Visual Studio 2012使用.在此之前的异步编程实现难度较高,async使异步编程的实现变得 ...
- .NET4.5 异步编程 async和await
msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行, ...
- .Net 4.5 异步编程初试(async和await)
.Net 4.5 异步编程初试(async和await) 前言 最近自己在研究Asp.Net Web API.在看到通过客户端来调用Web API的时候,看到了其中的异步编程,由于自己之前没有接触过, ...
- .net4.5使用async和await异步编程实例
关于异步编程的简单理解: 在.NET4.5中新增了异步编程的新特性async和await,使得异步编程更为简单.通过特性可以将这项复杂的工作交给编译器来完成了.之前传统的方式来实现异步编程较为复杂,这 ...
- C# 异步编程(async&await)
同步:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去 异步:异步是指进程不需要一直等下去,而是继续执行下面的操作 ...
随机推荐
- List的多维度排序案例演示~
文章也已同步到我的csdn:http://blog.csdn.net/u012881584/article/details/72377510 关于List的多维度排序. 日常工作中有很多关于list的 ...
- Hive的分区操作~~~~~~
一.Hive分区(一).分区概念:为什么要创建分区:单个表数据量越来越大的时候,在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据, ...
- servlet的过滤器的doFilter()
doFilter中的chain.doFilter(res,req);//Filter 只是链式处理,请求依然转发到目的地址 意思就说过滤器只是一个关口,如果符合条件的请求会被过滤器拦截下来,然后进行处 ...
- 类设计的SOLID原则
SOLID原则是面向对象范式的核心 单一职责原则(Single Responsible Principle, SRP):对于一个类,应该仅有一个引起它变化的原因.其基础是内聚,表示类完成单一功能的程度 ...
- CentOS7 防火墙规则 (firewalld)
1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status firewalld 停止: systemctl disab ...
- Dockerfile 最佳实践
之前 一篇文章介绍 docker 的镜像基本原理和概念 ,主要介绍在编写 docker 镜像的时候一些需要注意的事项和推荐的做法. 虽然 Dockerfile 简化了镜像构建的过程,并且把这个过程可以 ...
- [转]ef使用dbfirst方式连接mysql
为了学习ORM,选择了EntityFramework,经历了三天两夜的煎熬,N多次错误,在群里高手的帮助下,终于成功,现在将我的心路历程记录下来,一是让自己有个记录,另外就是让其它人少走些弯路. 我的 ...
- Venn Diagram Comparison of Boruta, FSelectorRcpp and GLMnet Algorithms
Feature selection is a process of extracting valuable features that have significant influence ondep ...
- vue-动手做个选择城市
查看完整的代码请到 我的github地址 https://github.com/qianyinghuanmie/vue2.0-demos 一.结果展示 二.前期准备: 1.引入汉字转拼音的插件, ...
- 解决shiro和quartz2 版本冲突问题
修改build.gradle compile ("org.quartz-scheduler:quartz:2.2.3") compile ("org.apache.s ...