【笔记】记一次.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)
同步:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去 异步:异步是指进程不需要一直等下去,而是继续执行下面的操作 ...
随机推荐
- Github SSH 的key 生成步骤下
Git是分布式的代码管理工具,远程的代码管理是基于SSH的,所以要使用远程的Git则需要SSH的配置. github的SSH配置如下: 一 . 设置Git的user name和email: $ git ...
- CopyOnWriteArrayList实现原理及源码分析
CopyOnWriteArrayList是Java并发包中提供的一个并发容器,它是个线程安全且读操作无锁的ArrayList,写操作则通过创建底层数组的新副本来实现,是一种读写分离的并发策略,我们也可 ...
- dbunit进行DAO层Excel单元测试
DAO层测试难点 可重复性,每次运行单元测试,得到的数据是重复的 独立性,测试数据与实际数据相互独立 数据库中脏数据预处理 不能给数据库中数据带来变化 DAO层测试方法 使用内存数据库,如H2.优点: ...
- Ehcache 整合Spring 使用页面、对象缓存(1)
转自:http://www.cnblogs.com/hoojo/archive/2012/07/12/2587556.html Ehcache在很多项目中都出现过,用法也比较简单.一般的加些配置就可以 ...
- css样式自动换行/强制换行
写样式时遇到的英文字符超出容器问题,度娘后了解下列知识,与大家分享,同时以便自己日后回顾. 一.自动换行问题 正常字符的换行是比较合理的,而连续的数字和英文字符常常将容器撑大. 下面介绍的是CSS如何 ...
- javascript基础-闭包
原理 函数里包含函数,即闭包. 包含函数的结果是,子函数会挟持父函数的活动对象.子函数在访问一个变量时,先读自身的活动对象,是否包含此变量,没有从父函数里找,还没有,去祖函数,层层回溯,直到windo ...
- php中的数组遍历的几种方式
[(重点)数组循环遍历的四种方式] 1.使用for循环遍历数组 conut($arr);用于统计数组元素的个数. for循环只能用于遍历,纯索引数组!!!! 如果存在关联数 ...
- android Activity Application Context 的区别
用了这么久的Context,对于Context究竟是个什么玩意一直不是很明白.看了网上十几篇文章的介绍 加上自己的理解总结一下.(自己想法,不对勿喷,不想照搬网上一些文字说法来糊弄自己,自己理解的就这 ...
- Spring+SpringMVC+MyBatis深入学习及搭建(九)——MyBatis和Spring整合
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/6964162.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(八)--My ...
- XCode 8.3 Automatically manage signing 问题
记录iOS证书问题 无意中选择了Personal team,后台自动生成bundle identifier:com.xxx.project,导致不能在Organization team创建,而且在de ...