转 .NET4.5之初识async与await

来自:http://www.cnblogs.com/lekko/archive/2013/03/05/2944282.html
  
本人是从.NET4.0刚出的时候接触的.NET环境,所以学的东西就是4.0及其之前的。时代飞速前进,目测5.0也快出了吧,但一直也没去接受新的技术。最近由于要学习Web API,快看完了,却发现4.5已经大行其道了,于是又进行补脑。async与await便是其中之一:
  这是两个关键字,用于异步编程。我们传统的异步编程方式一般是Thread、ThreadPool、BeginXXX、EndXXX等等。把调用、回调分开来,代码的逻辑是有跳跃的,于是会导致思路不是很清晰的问题,在.NET 4.5中,新推出的async、await关键字,可以帮助我们像写同步方法一样去写异步方法(保证代码的整齐清晰)。
  先来看个传统同步方法例子:
复制代码
1 static void Main(string[] args)
2 {
3 // 同步方式
4 Console.WriteLine("同步方式测试开始!");
5 SyncMethod(0);
6 Console.WriteLine("同步方式结束!");
7 Console.ReadKey();
8 }
9
10 // 同步操作
11 private static void SyncMethod(int input)
12 {
13 Console.WriteLine("进入同步操作!");
14 var result = SyancWork(input);
15 Console.WriteLine("最终结果{0}", result);
16 Console.WriteLine("退出同步操作!");
17 }
18
19 // 模拟耗时操作(同步方法)
20 private static int SyancWork(int val)
21 {
22 for (int i = 0; i 或void的返回类型;await关键字则是用于返回值是“可等待”类型(awaitable)的方法或lambda表达式内,“awaitable”可以是任何类型(常见的有Task、Task),它必须公开一个GetAwaiter() 方法并且返回有效的”awaiter”。更详细的信息可以参考“关于Async与Await的FAQ”,里面介绍了这些概念与注意事项。
  当一个async方法,且内部包含await关键字,它就会在编译的时候成为一个异步方法,如果没有await关键字,则它将只会被当成一个同步方法来执行。如果对其内部实现感兴趣可以参考“异步性能:了解 Async 和 Await 的成本”一文,相信对深入了解这种机制还是有所帮助的。
  现在我们尝试使用新出的异步关键字async、await来改造成异步调用:
复制代码
static void Main(string[] args)
{
// 异步方式
Console.WriteLine("\n异步方式测试开始!");
AsyncMethod(0);
Console.WriteLine("异步方式结束!");
Console.ReadKey();
}

// 异步操作
private static async void AsyncMethod(int input)
{
Console.WriteLine("进入异步操作!");
var result = await AsyncWork(input);
Console.WriteLine("最终结果{0}", result);
Console.WriteLine("退出异步操作!");
}

// 模拟耗时操作(异步方法)
private static async Task AsyncWork(int val)
{
for (int i = 0; i 的异步工作方式。
  补充:
  刚才有朋友提到await Task.Delay(100)这条语句,这是为了让AsyncWork成为异步方法才加的,如果你要进行的操作不支持await修饰怎么办,其实很简单,使用Task.Factory.StartNew()就行了,举例:
复制代码
1 // 异步操作
2 private static async void AsyncMethod(int input)
3 {
4 Console.WriteLine("进入异步操作!");
5 var result = await Task.Factory.StartNew((Func)SyncWork2, input);
6 Console.WriteLine("最终结果{0}", result);
7 Console.WriteLine("退出异步操作!");
8 }
9
10 // 模拟耗时操作(同步方法)
11 private static int SyncWork2(object input)
12 {
13 int val = (int)input;
14 for (int i = 0; i 转 .NET4.5之初识async与await

时间: 2024-12-29 07:24:36

转 .NET4.5之初识async与await的相关文章

NET4.5之初识async与await

这是两个关键字,用于异步编程.我们传统的异步编程方式一般是Thread.ThreadPool.BeginXXX.EndXXX等等.把调用.回调分开来,代码的逻辑是有跳跃的,于是会导致思路不是很清晰的问题,在.NET 4.5中,新推出的async.await关键字,可以帮助我们像写同步方法一样去写异步方法(保证代码的整齐清晰). 先来看个传统同步方法例子: 1 static void Main(string[] args) 2 { 3 // 同步方式 4 Console.WriteLine("同步

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

开篇 每一个版本的.net都会引入一些新的特性,这些特性方便开发人员能够快速实现一些功能.虽然.net版本一直在更新,但是新版本对旧版本的程序都是兼容的,在这一点上微软做的还是非常好的.每次学一个新内容,第一次接触的方法在脑海里占的位置还是比较重要的,从刚开始接触.net的多线程编程是使用Thread类,然后后面写的程序只要用到异步或者多线程就马上会想到用Thread,虽然知道委托的异步调用也能够实现,但是脑海里面的排在前面还是Thread类,在那个时候不知道他们之间的区别和优劣,也就不懂得如何

.NET4.5 异步编程 async和await

msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行,直到第一个await出现就开始异步执行,主线程等待,等带await这行代码异步完了再回到主线程,然后继续往下执行. 如果后面又遇到带await语句的,又异步执行,执行完了就回来,继续同步往下.依此类推. 这样做其实就把我们以前编写等待句柄接收信号的代码给省掉了,就一个await就搞定. Visual

.NET异步编程初识async与await

这是两个关键字,用于异步编程.我们传统的异步编程方式一般是Thread.ThreadPool.BeginXXX.EndXXX等等.把调用.回调分开来,代码的逻辑是有跳跃的,于是会导致思路不是很清晰的问题,在.NET 4.5中,新推出的async.await关键字,可以帮助我们像写同步方法一样去写异步方法(保证代码的整齐清晰). 先来看个传统同步方法例子: 1 static void Main(string[] args) 2 { 3 // 同步方式 4 Console.WriteLine("同步

.net4.5的异步 async await 和Task

首先应该明白Task的概念-----任务 //这是一种优于Thread,甚至是ThreadPool的东西 而且是默认异步 再来理解async和await: 1.async只是配合await,用来声明异步方法的关键字: 2.async和await之间,await才是关键,直接含义——"异步等待",主线程运行至异步方法内的await处,一般情况下主线程会立即返回上层方法,而await处后续的任务(方法)会新开线程继续执行,新开线程在执行“等待”出任务(方法)结果后,会接着运行完异步方法内a

c#之Async、Await剖析

c#之Async.Await剖析 探索c#之Async.Await剖析 2015-06-15 08:35 by 蘑菇先生, 1429 阅读, 5 评论, 收藏, 编辑 阅读目录: 基本介绍 基本原理剖析 内部实现剖析 重点注意的地方 总结 基本介绍 Async.Await是net4.x新增的异步编程方式,其目的是为了简化异步程序编写,和之前APM方式简单对比如下. APM方式,BeginGetRequestStream需要传入回调函数,线程碰到BeginXXX时会以非阻塞形式继续执行下面逻辑,完

封装WebService的APM为Async、Await模式利于Asp.Net页面调用

Wcf针对Async.Await指令直接可以返回Task<T>结果,但是老旧的系统中还是会有很多是在用Soap的Webservice.直接在Asp.Net页面调用APM方法确实比较麻烦,其实可以直接用TaskFactory封装APM模式为.Net4.5的async await模式,便于页面调用. 下面上实现代码,不多废话,注意注释: using System; using System.Collections.Generic; using System.Linq; using System.T

[.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库

此为文章备份,原文出处(我的网站)  [.NET 4.5] ADO.NET / ASP.NET 使用 Async 和 Await 异步 存取数据库 http://www.dotblogs.com.tw/mis2000lab/archive/2014/05/08/ado.net4.5_async_await_20140508.aspx 以前的ADO.NET也能作  "异步"(Async,大陆说法:异步),可以参考 KKBruce 2009/11月的文章: SQLCOMMAND的异步行程

C# 5.0 的 Async 和 Await (翻译)

这篇文章由Filip Ekberg为DNC杂志编写. 自跟随着.NET 4.5 及Visual Studio 2012的C# 5.0起,我们能够使用涉及到async和await关键字的新的异步模式.有很多不同观点认为,比起以前我们看到的,它的可读性和可用性是否更为突出.我们将通过一个例子来看下它跟现在的怎么不同. 线性代码vs非线性代码 大部分的软件工程师都习惯用一种线性的方式去编程,至少这是他们开始职业生涯时就被这样教导.当一个程序使用线性方式去编写,这意味着它的源代码读起来有的像Figure