多线程(5)async&await
.net 4.0的Task已经让我们可以非常简单地使用多线程,并且可以有返回值,也可以支持线程的取消等操作,可谓已经很强大了。但.net 4.5为我们带来了async&await,使得实现多线程的写法更简单,更优美,更符合线性思维。
下面通过一个例子来演示通过Task和async&await分别如何实现,并且最后还附上代码执行顺序图。
使用Task实现
如下代码:
#region 使用Task实现
static void TestByTask()
{
Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
var task = Task.Factory.StartNew<string>(() =>
{
return GetNameByTask();
});
Console.WriteLine("get another thread result,result:" + task.Result);
Console.WriteLine("main thread completed!");
} static string GetNameByTask()
{
Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
return "mcgrady";
}
#endregion
输出结果:

使用async&await实现
假如使用async&await如何实现呢,如下代码:
#region 使用async&await实现
static async void TestByAsyncAwait()
{
Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
var name = GetNameByAsyncAwait(); Console.WriteLine(string.Format("get another thread result,result:{0}", await name));
Console.WriteLine("main thread completed!");
} static async Task<string> GetNameByAsyncAwait()
{
return await Task.Factory.StartNew<string>(() =>
{
Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
return "mcgrady";
});
}
#endregion
输出结果:

输出结果跟使用Task相同。
代码执行流程如下图:

完整代码:
namespace ConsoleApplication25
{
class Program
{
static void Main(string[] args)
{
//1,使用task实现
//TestByTask(); //2,使用async&await实现
TestByAsyncAwait(); Console.ReadKey();
} #region 使用Task实现
static void TestByTask()
{
Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
var task = Task.Factory.StartNew<string>(() =>
{
return GetNameByTask();
});
Console.WriteLine("get another thread result,result:" + task.Result);
Console.WriteLine("main thread completed!");
} static string GetNameByTask()
{
Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
return "mcgrady";
}
#endregion #region 使用async&await实现
static async void TestByAsyncAwait()
{
Console.WriteLine("main thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
var name = GetNameByAsyncAwait(); Console.WriteLine(string.Format("get another thread result,result:{0}", await name));
Console.WriteLine("main thread completed!");
} static async Task<string> GetNameByAsyncAwait()
{
return await Task.Factory.StartNew<string>(() =>
{
Console.WriteLine("another thread start,current thread id:" + Thread.CurrentThread.ManagedThreadId);
return "mcgrady";
});
}
#endregion
}
}
多线程(5)async&await的更多相关文章
- async await 多线程
async await 并没有开启多线程 出现await的地方 只是开启了一个子线程继续往后执行 主线程返回 防止阻塞 相当于 await customerRepository.getall() ...
- 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 ...
- 聊聊多线程那一些事儿 之 五 async.await深度剖析
hello task,咱们又见面啦!!是不是觉得很熟读的开场白,哈哈你哟这感觉那就对了,说明你已经阅读过了我总结的前面4篇关于task的文章,谢谢支持!感觉不熟悉的也没有关系,在文章末尾我会列出前四 ...
- async/await到底该怎么用?如何理解多线程与异步之间的关系?
前言 如标题所诉,本文主要是解决是什么,怎么用的问题,然后会说明为什么这么用.因为我发现很多萌新都会对之类的问题产生疑惑,包括我最初的我,网络上的博客大多知识零散,刚开始看相关博文的时候,就这样.然后 ...
- async/await的多线程问题
今天尝试把.net4.5新增的异步编程模型async/await加入自己的框架,因为从第一印象看,使用async/await的写法实在太方便了,以同步代码的方式写异步流程,写起来更顺畅,不容易打断思路 ...
- C#多线程和异步(二)——Task和async/await详解
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
- C#多线程和异步(二)——Task和async/await详解(转载)
一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...
- C#多线程和异步——Task和async/await详解
阅读目录 一.什么是异步 二.Task介绍 1 Task创建和运行 2 Task的阻塞方法(Wait/WaitAll/WaitAny) 3 Task的延续操作(WhenAny/WhenAll/Cont ...
- [.NET] 利用 async & await 的异步编程
利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html 目录 异步编程的简介 异 ...
随机推荐
- java.net.ConnectException: Connection refused 异常
错误信息: java.net.ConnectException: Connection refused at java.net.PlainSocketImpl.socketConnect(Native ...
- .net Core 2.0应用程序发布到IIS上注意事项
.net Core2.0应用程序发布window服务器报错容易错过的配置. 1.应用程序发布. 2.IIS上新建网站. 3.应用程序池选择无托管代码. 4.服务器上安装DotNetCore.1.0.1 ...
- js发送post请求,实现下载文件
由于业务需求要下载文件的功能: <!DOCTYPE html> <html> <head> <meta charset="utf-8"&g ...
- 阿里面试题,深入理解Java类加载机制
类的生命周期 包括以下 7 个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Resolution) 初始化(Initialization) 使 ...
- [Swift]LeetCode251.展平二维向量 $ Flatten 2D Vector
Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...
- [Swift]LeetCode788. 旋转数字 | Rotated Digits
X is a good number if after rotating each digit individually by 180 degrees, we get a valid number t ...
- springBoot(12)---整合Swagger2
Spingboot整合Swagger2 随着互联网技术的发展,一般开发都是前后端分离,那么前端和后端的唯一联系,变成了API接口:API文档变成了前后端开发人员联系的纽带,变得越来越重要,没有API ...
- CSS,JavaScript知识点
1.css重用 <style> 如果整个页面的宽度 > 900px时: { . ...
- Qt之自定义检索框
1.效果展示 今天这篇文章主要讲解的是自定义搜索框,不仅仅支持搜索,而且可以支持搜索预览,具体请看效果图1.网上也有一些比较简单明了的自定义搜索框,比如Qt之自定义搜索框,讲的也比较详细,不过本文的侧 ...
- Ocelot + Consul实践
关于Consul(https://www.consul.io)是一个分布式,高可用,支持多数据中心的服务发现和配置共享的服务软件,由 HashiCorp 公司用 Go 语言开发, 基于 Mozilla ...