【笔记】记一次.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)
同步:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去 异步:异步是指进程不需要一直等下去,而是继续执行下面的操作 ...
随机推荐
- 我对Stub和Mock的理解
介绍 使用测试驱动开发大半年了,我还是对Stub和Mock的认识比较模糊,没有进行系统整理. 今天查阅了相关资料,觉得写得很不错,所以我试图在博文中对资料进行整理一下,再加上一些自己的观点. 本文是目 ...
- 编写自己的一个简单的web容器(一)
在之前的博客中我更大家说过Http协议是对tcp协议的封装,其底层还是使用tcp协议来进行数据传出的,浏览器实际上就是一个Socket客户端,今天呢我们就开始着手利用ServerSocket来编写一个 ...
- EMC在线测试题目及答案 绿色为正确答案,红色为错误答案
1. 以下哪一项技术可以将IT的物理资源放在一个共享池中以及提升它们的利用率? 分区 虚拟化 协调 LUN 屏蔽 2. 哪一项是EMC的基于块-存储(block-based)的高端存储? Atmos ...
- Java实现的高效计数器
本文转载地址: http://blog.csdn.net/snarlfuture/article/details/17049731 在统计来自数据库或文本中某些内容的频率时,你可 ...
- 我来说说XML文件中的xmlns、xmlns:xsi和xsi:schemaLocation的具体含义
文章摘自:https://yq.aliyun.com/articles/40353 http://www.cnblogs.com/zhao1949/p/5652167. ...
- Telnet的开启及使用
1首先在控制面板找到程序和功能,双击点开. 2,点击打开或关闭WINDOWS功能 3勾选上这两项 点击确定即可. ------------------------------------------- ...
- Flume简介及安装
Hadoop业务的大致开发流程以及Flume在业务中的地位: 从Hadoop的业务开发流程图中可以看出,在大数据的业务处理过程中,对于数据的采集是十分重要的一步,也是不可避免的一步,从而引出我们本文的 ...
- 《算法4》2.1 - 选择排序算法(Selection Sort), Python实现
选择排序算法(Selection Sort)是排序算法的一种初级算法.虽然比较简单,但是基础,理解了有助于后面学习更高深算法,勿以勿小而不为. 排序算法的语言描述: 给定一组物体,根据他们的某种可量化 ...
- EIGRP负载均衡、手工汇总、泄露明细、安全认证
基于6.6.6.6/24访问13.1.1.1/24进行负载均衡实例图 一.等价负载均衡 等价负载均衡前,R5路由器背后的6.6.6.6/24访问R1的13.1.1.1/24, 从15.1.1.0/24 ...
- C语言数组之冒泡排序+折半查找法(二分查找)
冒泡排序算法 将相邻的元素进行两两比较,大的向后"冒", 小的向前"赶". 口诀: N个数字来排队,两两比较小靠前 外层循环N-1(控制需要比较的轮数). 内层 ...