多线程(5)async&await

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

时间: 2024-08-08 21:53:23

多线程(5)async&await的相关文章

C#的多线程——使用async和await来完成异步编程(Asynchronous Programming with async and await)

https://msdn.microsoft.com/zh-cn/library/mt674882.aspx 侵删 更新于:2015年6月20日 欲获得最新的Visual Studio 2017 RC文档,参考Visual Studio 2017 RC Documentation. 使用异步编程,你可以避免性能瓶颈和提升总体相应效率.然而,传统的异步方法代码的编写方式比较复杂,导致它很难编写,调试和维护. Visual Studio 2012引入了一个简单的异步编程的方法,依赖.NET Fram

[原]async/await的多线程问题

今天尝试把.net4.5新增的异步编程模型async/await加入自己的框架,因为从第一印象看,使用async/await的写法实在太方便了,以同步代码的方式写异步流程,写起来更顺畅,不容易打断思路,异常传递.资源控制(lock和using)也都完美支持,即使有少量的性能损失,也完全可以接受. 首先我写了一个测试代码,以熟悉async/await模型,代码如下: static class TestCase { static async Task Test2() { Console.WriteL

C#多线程和异步——Task和async/await详解

阅读目录 一.什么是异步 二.Task介绍 1 Task创建和运行 2 Task的阻塞方法(Wait/WaitAll/WaitAny) 3 Task的延续操作(WhenAny/WhenAll/ContinueWith) 4 Task的任务取消(CancellationTokenSource) 三.异步方法(async/await) 回到顶部 一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时

.NET 中的 async/await 异步编程

前言 最近在学习Web Api框架的时候接触到了async/await,这个特性是.NET 4.5引入的,由于之前对于异步编程不是很了解,所以花费了一些时间学习一下相关的知识,并整理成这篇博客,如果在阅读的过程中发现不对的地方,欢迎大家指正. 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异步编程的核心是使用多线程,通过让不同的线程执行不同的任务,实现不同代码的并行运行. 前台线程与后台线程 关于多线程,早在.NET2

C#中 Thread,Task,Async/Await,IAsyncResult 的那些事儿!

说起异步,Thread,Task,async/await,IAsyncResult 这些东西肯定是绕不开的,今天就来依次聊聊他们 1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部分可以同时执行:对于比较耗时的操作(例如io,数据库操作),或者等待响应(如WCF通信)的操作,可以单独开启后台线程来执行,这样主线程就不会阻塞,可以继续往下执行:等到后台线程执行完毕,再通知主线程,然后做出对应操作! 在C#中开启新线程比较简单 static void Main(string[]

关于异步执行(Async/await)的理解(转发)

原文地址: http://blog.jobbole.com/85787/ 同步编程与异步编程 通常情况下,我们写的C#代码就是同步的,运行在同一个线程中,从程序的第一行代码到最后一句代码顺序执行.而异步编程的核心是使用多线程,通过让不同的线程执行不同的任务,实现不同代码的并行运行. 前台线程与后台线程 关于多线程,早在.NET2.0时代,基础类库中就提供了Thread实现.默认情况下,实例化一个Thread创建的是前台线程,只要有前台线程在运行,应用程序的进程就一直处于运行状态,以控制台应用程序

[.NET] 利用 async &amp; await 的异步编程

利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异步提高响应能力 更容易编写的异步方法 异步方法的控制流 线程 async 和 await 返回类型和参数信息 命名的约定 一.异步编程的简介 通过使用异步编程,你可以避免性能瓶颈并增强应用程序的总体响应能力. Visual Studio 2012 引入了一个简化的方法,异步编程,在 .NET Framewo

C# Async, Await and using statements

Async, Await 是基于 .NEt 4.5架构的, 用于处理异步,防止死锁的方法的开始和结束, 提高程序的响应能力.比如: Application area           Supporting APIs that contain async methods Web access                    HttpClient , SyndicationClient Working with files           StorageFile, StreamWrite

异步(1) async &amp; await

1 什么是异步 异步的另外一种含义是计算机多线程的异步处理.与同步处理相对,异步处理不用阻塞当前线程来等待处理完成,而是允许后续操作,直至其它线程将处理完成,并回调通知此线程. 2 异步场景 l  不涉及共享资源,或对共享资源只读,即非互斥操作 l  没有时序上的严格关系 l  不需要原子操作,或可以通过其他方式控制原子性 l  常用于IO操作等耗时操作,因为比较影响客户体验和使用性能 l  不影响主线程逻辑 3 异步编写 C# Async  await关键字 Async method 三种返回