.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的更多相关文章

  1. async await 多线程

    async await 并没有开启多线程  出现await的地方 只是开启了一个子线程继续往后执行  主线程返回 防止阻塞 相当于  await customerRepository.getall() ...

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

  3. 聊聊多线程那一些事儿 之 五 async.await深度剖析

     hello task,咱们又见面啦!!是不是觉得很熟读的开场白,哈哈你哟这感觉那就对了,说明你已经阅读过了我总结的前面4篇关于task的文章,谢谢支持!感觉不熟悉的也没有关系,在文章末尾我会列出前四 ...

  4. async/await到底该怎么用?如何理解多线程与异步之间的关系?

    前言 如标题所诉,本文主要是解决是什么,怎么用的问题,然后会说明为什么这么用.因为我发现很多萌新都会对之类的问题产生疑惑,包括我最初的我,网络上的博客大多知识零散,刚开始看相关博文的时候,就这样.然后 ...

  5. async/await的多线程问题

    今天尝试把.net4.5新增的异步编程模型async/await加入自己的框架,因为从第一印象看,使用async/await的写法实在太方便了,以同步代码的方式写异步流程,写起来更顺畅,不容易打断思路 ...

  6. C#多线程和异步(二)——Task和async/await详解

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

  7. C#多线程和异步(二)——Task和async/await详解(转载)

    一.什么是异步 同步和异步主要用于修饰方法.当一个方法被调用时,调用者需要等待该方法执行完毕并返回才能继续执行,我们称这个方法是同步方法:当一个方法被调用时立即返回,并获取一个线程执行该方法内部的业务 ...

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

    阅读目录 一.什么是异步 二.Task介绍 1 Task创建和运行 2 Task的阻塞方法(Wait/WaitAll/WaitAny) 3 Task的延续操作(WhenAny/WhenAll/Cont ...

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

    利用 async & await 的异步编程 [博主]反骨仔 [出处]http://www.cnblogs.com/liqingwen/p/5922573.html  目录 异步编程的简介 异 ...

随机推荐

  1. Android Studio 去除上方标题

    选中代码再Ctrl+shift+'/' 可加/***/注释 https://blog.csdn.net/wuqingsen1/article/details/78554117 styles.xml & ...

  2. css基础样式

    1.行间样式:在标签中添加<style>属性      格式:标签名 style="样式:样式值1;样式2=样式值2"   2.内嵌样式:在<head>&l ...

  3. Winsock编程基础1

    1.加载和释放Winsoke库 //所有Winsock函数都是从WS2_32.DLL导出,包含相应库文件#include <winsock2.h>#pragma comment(lib, ...

  4. 几个比较常用的jar包

    implementation 'com.android.support:recyclerview-v7:26+'implementation 'org.greenrobot:eventbus:3.1. ...

  5. FCC(ES6写法) Inventory Update

    依照一个存着新进货物的二维数组,更新存着现有库存(在 arr1 中)的二维数组. 如果货物已存在则更新数量 . 如果没有对应货物则把其加入到数组中,更新最新的数量. 返回当前的库存数组,且按货物名称的 ...

  6. Linux下CenOS系统 安装MariaDB

    1.首先去MariaDB官网下载安装包,首页是:https://mariadb.org/ 2.放在linux下的新建目录下:/root/mariadb 然后解压缩,命令为:tar -xzvf mari ...

  7. 基于Java实现简化版本的布隆过滤器

    一.布隆过滤器: 布隆过滤器(Bloom Filter)是1970年由布隆提出的.它实际上是一个很长的二进制向量和一系列随机映射函数.布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率 ...

  8. [Swift]LeetCode453. 最小移动次数使数组元素相等 | Minimum Moves to Equal Array Elements

    Given a non-empty integer array of size n, find the minimum number of moves required to make all arr ...

  9. [Swift]LeetCode882. 细分图中的可到达结点 | Reachable Nodes In Subdivided Graph

    Starting with an undirected graph (the "original graph") with nodes from 0 to N-1, subdivi ...

  10. setData方法修改data中对象或数组的属性值(小程序开发)

    今日在开发小程序地图的过程中,遇到一个问题,困扰了我一会 业务如下: 困扰点: 我不知道如何修改data中数组包含的对象是如何修改的:期初的想法还是想共享上面的数据,想的太简单了 正确的解决步骤: 直 ...