多线程async&await

mcgrady mcgrady     2022-09-05     675

关键词:

  .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 }
View Code

 

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 查看详情