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的异步编程实验与笔记。的更多相关文章

  1. C#语法——泛型的多种应用 C#语法——await与async的正确打开方式 C#线程安全使用(五) C#语法——元组类型 好好耕耘 redis和memcached的区别

    C#语法——泛型的多种应用   本篇文章主要介绍泛型的应用. 泛型是.NET Framework 2.0 版类库就已经提供的语法,主要用于提高代码的可重用性.类型安全性和效率. 泛型的定义 下面定义了 ...

  2. C#语法——await与async的正确打开方式

    C#5.0推出了新语法,await与async,但相信大家还是很少使用它们.关于await与async有很多文章讲解,但有没有这样一种感觉,你看完后,总感觉这东西很不错,但用的时候,总是想不起来,或者 ...

  3. .NET4.5新特性async和await修饰符实现异步编程

    开篇 每一个版本的.net都会引入一些新的特性,这些特性方便开发人员能够快速实现一些功能.虽然.net版本一直在更新,但是新版本对旧版本的程序都是兼容的,在这一点上微软做的还是非常好的.每次学一个新内 ...

  4. async和await是如何实现异步编程?

    目录 异步编程样例 样例解析 浅谈Promise如何实现异步执行 参考 1.异步编程样例 样例: // 等待执行函数 function sleep(timeout) { return new Prom ...

  5. 《C#并发编程经典实例》学习笔记—异步编程关键字 Async和Await

    C# 5.0 推出async和await,最早是.NET Framework 4.5引入,可以在Visual Studio 2012使用.在此之前的异步编程实现难度较高,async使异步编程的实现变得 ...

  6. .NET4.5 异步编程 async和await

    msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行, ...

  7. .Net 4.5 异步编程初试(async和await)

    .Net 4.5 异步编程初试(async和await) 前言 最近自己在研究Asp.Net Web API.在看到通过客户端来调用Web API的时候,看到了其中的异步编程,由于自己之前没有接触过, ...

  8. .net4.5使用async和await异步编程实例

    关于异步编程的简单理解: 在.NET4.5中新增了异步编程的新特性async和await,使得异步编程更为简单.通过特性可以将这项复杂的工作交给编译器来完成了.之前传统的方式来实现异步编程较为复杂,这 ...

  9. C# 异步编程(async&await)

    同步:同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去 异步:异步是指进程不需要一直等下去,而是继续执行下面的操作 ...

随机推荐

  1. 头皮发麻的HTML课时一

    话说我都不知道有多少天没有更新我的随笔了,不过我忽的一下发现到灵魂深处的罪孽:好吧,不扯淡了,其实就是自己懒得外加上HTML这个东西又实在是很重要,所以良心发现把我自己所学的给记录下来,我会尽量的写的 ...

  2. JEESZ-Zookeeper集群安装

    1. 在根目录创建zookeeper文件夹(service1.service2.service3都创建) [root@localhost /]# mkdir zookeeper 通过Xshell上传文 ...

  3. 深入Android RxJava 2

    这篇文章是根据Jake Wharton在GOTO CopenHagen 2016上的讲话整理的. 下一个版本(2.0)的RxJava还在开发中.虽然observable.订阅管理和背压(backpre ...

  4. iOS学习之应用之间的操作(转发)

    首先要说的是每一个APP都可以设置一个自己独有的URL,APP应用之间的操作就是通过这个URL来实现的! 1.如何配置自己应用的URL? 关于自己的URL,作为资深的程序猿都会想到 Info.plis ...

  5. Handling Class Imbalance with R and Caret - An Introduction

    When faced with classification tasks in the real world, it can be challenging to deal with an outcom ...

  6. 深入理解Java常用类-----时间日期

    除了String这个类在日常的项目中比较常用之外,有关时间和日期的操作也是经常遇到的,本篇就讲详细介绍下Java API中对时间和日期的支持.其实在Java 8之前时间日期的API并不是很好用,以至于 ...

  7. OVS + kernel datapath 的安装

    ***kernel datapath的OVS编译安装 下载源代码 $ git clone https://github.com/openvswitch/ovs.git 准备工具:生成configure ...

  8. JavaSE教程-03Java中分支语句与四种进制转换-思维导图

    思维导图看不清楚时: 1)可以将图片另存为图片,保存在本地来查看 2)右击在新标签中打开放大查看 if语句 a) if语句 基本语法结构: if(关系表达式) { 基本语句体 } 执行流程: 首先判断 ...

  9. springmvc 添加@ResponseBody

    1.添加ResponseBody之后的话 返回字符串的时候 就是一个字符串. @RequestMapping(value = "/{bookId}/detail.do",metho ...

  10. win7下 mysql安装(mysql-5.7.18-winx64.zip)

    cmd到mysql/bin目录下 应该是先mysqld --initialize然后mysqld -install最后net start mysql