【笔记】记一次.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)
同步:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去 异步:异步是指进程不需要一直等下去,而是继续执行下面的操作 ...
随机推荐
- o(n)线性排序算法
O(n) 排序算法 前言 前面有总结过各类常用的排序算法,但是那些排序算法最优的时间复杂度是O(nlogn),所以我要介绍三种时间复杂度为O(n)的线性时间复杂度的排序算法. 计数排序 计数排序利用了 ...
- SQLite 之 C#版 System.Data.SQLite 使用
简介 SQLite简介 SQLite,是一款轻型的关系型数据库.它的设计目标是嵌入式. 它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 C++.C ...
- Java过滤敏感词语/词汇---DFA算法
最近网站需要在评论.投稿等地方过滤敏感词汇,于是在网上查找了相关教程,特此整理分享. 关于DFA算法,详细的可以去http://blog.csdn.net/u013378306/article/det ...
- Hive load from hdfs 出错
hive 加载HDFS的数据时出现错误, FATAL:SemanticException [Error 10028] search了一下,跟他一样Hive load from hdfs 出错. 我按照 ...
- 【JAVAWEB学习笔记】22_ajax
Js原生Ajax和Jquery的Ajax 学习目标 案例1-异步校验用户名是否存在 案例2-站内查询 一.Ajax概述 1.什么是同步,什么是异步 同步现象:客户端发送请求到服务器端,当服务器返回响应 ...
- 互联网二次进化—VR全景智慧城市
vr全景智慧城市被称为中国首家商业全景平台.VR被称为下一代超级人机交互平台. 时间往前推20年,1996年,电脑还是很新鲜的玩意儿.那时,我第一次接触电脑,在我父亲供职的单位,一个开着空调的房间里, ...
- 同步文件的利器-rsync
即使你只是个人用户而不是一个企业,备份你自己的数据也是非常重要的,我不想失去任何这些数据. rsync是同步文件的利器,一般用于多个机器之间的文件同步与备份,同时也支持在本地的不同目录之间互相同步文件 ...
- 深入理解Activity的启动模式
众所周知,当我们多次启动同一个Activity时,会创建多个该Activity的实例,系统会按照先进后出的原则,将它们一一放进任务栈中,然后我们按back键,系统就会将栈顶的Activity移除栈,直 ...
- OpenGL: Rotation vector sensor of Android and Device motion of iOS
为了实现一个全景图片展示的功能,需要借助手机的姿态传感器,实现一个这样的功能:当手机旋转时,视角也跟着旋转(读者若理解不能,可以参考下现在流行的 VR 应用,使用陀螺仪模式时的效果,亦可称作" ...
- UILabel图文混排显示图片和文字
//传入文字 自动图片放在左边文字紧接着后排排布 -(void)setAttrDetailLabelWithTitle:(NSString *)title { NSMutableAttributedS ...