多线程(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 目录 异步编程的简介 异 ...
随机推荐
- win10常用快捷键
记住Win10一些常用的快捷键,在使用电脑的过程中,可以快速的切换不同的功能窗口,减少鼠标的操作.大大提高工作效率.来看看下面这些常用的. Win键+Tab:激活任务视图 Win键+A:激活操作中心 ...
- [Java]LeetCode138. 复制带随机指针的链表 | Copy List with Random Pointer
A linked list is given such that each node contains an additional random pointer which could point t ...
- [Swift]LeetCode279. 完全平方数 | Perfect Squares
Given a positive integer n, find the least number of perfect square numbers (for example, 1, 4, 9, 1 ...
- [Swift]LeetCode291. 单词模式 II $ Word Pattern II
Given a pattern and a string str, find if strfollows the same pattern. Here follow means a full matc ...
- [Swift]LeetCode941. 有效的山脉数组 | Valid Mountain Array
Given an array A of integers, return true if and only if it is a valid mountain array. Recall that A ...
- [Swift]LeetCode977. 有序数组的平方 | Squares of a Sorted Array
Given an array of integers A sorted in non-decreasing order, return an array of the squares of each ...
- 【dotNet Core】Swagger下简单的给WebApi分组
Startup.cs下ConfigureServices代码 这里主要在DocInclusionPredicate控制输出那些api. Startup.cs下Configure代码 给Controll ...
- python网络-多线程(22)
一.什么是线程 线程(英语:thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.同一进程中的多条线程将共享该进程中的全部系统资源,一个进程可以有很多线程,每 ...
- CDN边缘节点容器调度实践(下)
5月27日,OSC 源创会在上海成功举办.又拍云系统开发高级工程师黄励博在大会分享了<CDN 边缘节点容器调度的实践>.主要介绍又拍云自主开发的边缘节点容器调度方案,从 0 到 1 ,实现 ...
- java代码之美(4)---guava之Immutable(不可变)集合
Immutable(不可变)集合 一.概述 guava是google的一个库,弥补了java语言的很多方面的不足,很多在java8中已有实现,暂时不展开.Collections是jdk提供的一个工具类 ...