关键词:
.net 4.0的Task已经让我们可以非常简单地使用多线程,并且可以有返回值,也可以支持线程的取消等操作,可谓已经很强大了。但.net 4.5为我们带来了async&await,使得实现多线程的写法更简单,更优美,更符合线性思维。
下面通过一个例子来演示通过Task和async&await分别如何实现,并且最后还附上代码执行顺序图。
使用Task实现
如下代码:
1 #region 使用Task实现 2 static void TestByTask() 3 { 4 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 5 var task = Task.Factory.StartNew<string>(() => 6 { 7 return GetNameByTask(); 8 }); 9 Console.WriteLine("get another thread result,result:" + task.Result); 10 Console.WriteLine("main thread completed!"); 11 } 12 13 static string GetNameByTask() 14 { 15 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 16 return "mcgrady"; 17 } 18 #endregion
输出结果:
使用async&await实现
假如使用async&await如何实现呢,如下代码:
1 #region 使用async&await实现 2 static async void TestByAsyncAwait() 3 { 4 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 5 var name = GetNameByAsyncAwait(); 6 7 Console.WriteLine(string.Format("get another thread result,result:{0}", await name)); 8 Console.WriteLine("main thread completed!"); 9 } 10 11 static async Task<string> GetNameByAsyncAwait() 12 { 13 return await Task.Factory.StartNew<string>(() => 14 { 15 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 16 return "mcgrady"; 17 }); 18 } 19 #endregion
输出结果:
输出结果跟使用Task相同。
代码执行流程如下图:
完整代码:
1 namespace ConsoleApplication25 2 { 3 class Program 4 { 5 static void Main(string[] args) 6 { 7 //1,使用task实现 8 //TestByTask(); 9 10 //2,使用async&await实现 11 TestByAsyncAwait(); 12 13 Console.ReadKey(); 14 } 15 16 #region 使用Task实现 17 static void TestByTask() 18 { 19 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 20 var task = Task.Factory.StartNew<string>(() => 21 { 22 return GetNameByTask(); 23 }); 24 Console.WriteLine("get another thread result,result:" + task.Result); 25 Console.WriteLine("main thread completed!"); 26 } 27 28 static string GetNameByTask() 29 { 30 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 31 return "mcgrady"; 32 } 33 #endregion 34 35 #region 使用async&await实现 36 static async void TestByAsyncAwait() 37 { 38 Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 39 var name = GetNameByAsyncAwait(); 40 41 Console.WriteLine(string.Format("get another thread result,result:{0}", await name)); 42 Console.WriteLine("main thread completed!"); 43 } 44 45 static async Task<string> GetNameByAsyncAwait() 46 { 47 return await Task.Factory.StartNew<string>(() => 48 { 49 Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId); 50 return "mcgrady"; 51 }); 52 } 53 #endregion 54 } 55 }
async&await的前世今生
async&await=customIAsyncStateMachineasync&await是IAsyncStateMachine的语法糖验证分别使用async&await和IAsyncStateMachine遍历一棵树,查看二者的线程id和线程上下文标识是否相同数据结构publicclassNode{privatestaticList<Node>_nodes 查看详情
多线程编程学习笔记——async和await
接上文多线程编程学习笔记——async和await(一)接上文多线程编程学习笔记——async和await(二)五、 处理异步操作中的异常 本示例学习如何在异步函数中处理异常,学习如何对多个并... 查看详情
多线程编程学习笔记——async和await
接上文多线程编程学习笔记——async和await(一)三、 对连续的异步任务使用await操作符 本示例学习如何阅读有多个await方法方法时,程序的实际流程是怎么样的,理解await的异步调用。1... 查看详情
async&await异步编程的一点巧方法
await关键字不会创建新的线程,而是由Task任务或是FCL中的xxxAsync等方法创建的线程,而且这里创建的线程都是基于线程池创建的工作线程,属于后台线程。 await关键字会阻塞/暂停调用它的方法,也即下面的Phycology方法.当阻塞... 查看详情
async与await线程调用顺序
用async做一个多线程下载并在datagridview中即时更新,运行时在达到4个线程同时下载时界面卡顿,多次尝试后是不知道async与await线程调用顺序造成。进入async方法后在调用await之前代码都在主线程(调用线程)中运行,调用await时... 查看详情
TPL 和 async/await 之间的区别(线程处理)
】TPL和async/await之间的区别(线程处理)【英文标题】:DifferencebetweentheTPL&async/await(Threadhandling)【发布时间】:2012-05-0408:05:19【问题描述】:在线程创建方面尝试了解TPL和async/await之间的区别。我相信TPL(TaskFactory.StartNew)的工作... 查看详情
c#之多线程--任务概念以及使用示例(task|taskcompletionsource|async|await)(代码片段)
C#之异步多线程任务相关以及概念使用介绍一,相关关键字和运算符1.1Async/Await介绍和使用示例1.2Async/Await异步编程中的最佳做法二,Task类2.1Task定义2.2属性方法1.3Task使用三,TaskCompletionSource类3.1概念定义3.2属性函数3.3模拟... 查看详情
多线程之异步编程:经典和最新的异步编程模型,async与await
经典的异步编程模型(IAsyncResult)最新的异步编程模型(async和await)将IAsyncInfo转换成Task将Task转换成IAsyncInfo示例1、使用经典的异步编程模型(IAsyncResult)实现一个支持异步操作的类Thread/Async/ClassicAsync.cs/**使用经典的异步编程... 查看详情
c#多线程和异步——task和async/await详解(代码片段)
阅读目录一、什么是异步二、Task介绍1Task创建和运行 2Task的阻塞方法(Wait/WaitAll/WaitAny) 3Task的延续操作(WhenAny/WhenAll/ContinueWith) 4Task的任务取消(CancellationTokenSource)三、异步方法(async/await) 回到顶部一、什么是异步 ... 查看详情
async&await的前世今生
一、创建线程classProgram{privatestaticvoidMain(string[]args){newThread(Go).Start();//.NET1.0开始就有的Task.Factory.StartNew(Go);//.NET4.0引入了TPLTask.Run(newAction(Go));//.NET4.5新增了一个Run的方法Console.Read();}publicst 查看详情
.net的async和await
...关系是两兄弟,Task是父辈,Thread是爷爷辈,这就是.net多线程处理的东西,具体包括创建线程,线程结果返回,线程中止,线程中的异常处理1线程创建的几个方式staticvoidMain(string[]args){newThread(NewThread).Start();//这里需要注意:创建... 查看详情
async&await异步请求处理办法(代码片段)
async&await异步请求处理办法目录async&await异步请求处理办法async&await一、async1、async函数2、回调async函数以获取结果二、await末async&awaitasync函数&await规定于ES2017.它们是基于promises的语法糖,使我们得以以更简洁的方式... 查看详情
c#的多线程——使用async和await来完成异步编程(asynchronousprogrammingwithasyncandawait)
https://msdn.microsoft.com/zh-cn/library/mt674882.aspx侵删 更新于:2015年6月20日欲获得最新的VisualStudio2017RC文档,参考VisualStudio2017RCDocumentation。使用异步编程,你可以避免性能瓶颈和提升总体相应效率。然而,传统的异步方法代码的编... 查看详情
EF 数据上下文 - 异步/等待和多线程
】EF数据上下文-异步/等待和多线程【英文标题】:EFDataContext-Async/Await&Multithreading【发布时间】:2014-01-2315:54:21【问题描述】:我经常使用async/await来确保ASP.NETMVCWebAPI线程不会被长时间运行的I/O和网络操作(特别是数据库调用... 查看详情
async&await
【await】 The await operatorisusedtowaitfora Promise.Itcanonlybeusedinside an asyncfunction. Returnstheresolvedvalueofthepromise,orthevalueitselfifit‘snota Promise. The& 查看详情
使用 async/await 会创建一个新线程吗?
】使用async/await会创建一个新线程吗?【英文标题】:Doestheuseofasync/awaitcreateanewthread?【发布时间】:2015-01-3116:01:20【问题描述】:我是TPL的新手,我想知道:C#5.0新增的异步编程支持(通过新的async和await关键字)与线程的创建有... 查看详情
demo_09async&await
// async位于函数字面量或函数表达式的前面(普通函数,立即执行函数,箭头函数均可),被修饰函数的返回一个Promise对象// 简化Promise的使用过程,让你的异步代码看起来像是同步的/*await一定要位于async函数内部await一般位... 查看详情
Await/Async 和 Task 的说明
...时间】:2015-06-0215:10:02【问题描述】:最近我开始使用多线程,并试图更好地理解await/async和Task。我输入了以下场景:privatevoidbutton1_Click(objectsender,EventArgse)varlist=GenerateList();progressBa 查看详情