博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net Core WebAPI 基于Task的同步&异步编程快速入门
阅读量:7042 次
发布时间:2019-06-28

本文共 2054 字,大约阅读时间需要 6 分钟。

并行任务(Task)以及基于Task的异步编程(asynchronously)在.NET Framework早已使用多年,而在微软新推出的.NET Core 平台下也有相同功能的实现,本文将通过.NET Core WebAPI,介绍使用Task.result的同步编程以及使用await的异步编程模型。

Task.Result

Result方法可以返回Task执行后的结果,如下代码:

[HttpGet]public static async Task
GetJsonAsync(Uri uri){ using (var client = new HttpClient()) { var jsonString = await client.GetStringAsync(uri); return JObject.Parse(jsonString); }}public class MyController : ApiController{ public string Get() { var jsonTask = GetJsonAsync(...); return jsonTask.Result.ToString(); }}

但是如果在ASP.NET Core的webapi中使用result方法来获取task输出值,会造成当前API线程阻塞等待到task执行完成后再继续进行。可以通过下面代码来证明,get方法有一个线程,调用一个新线程执行task(taskcaller),在执行task时候由于需要等待task的执行结果,此时get方法的执行线程等待中,直到result结果输出,此线程继续完成方法。

[HttpGet]public string Get(){    var info = string.Format("api执行线程:{0}", Thread.CurrentThread.ManagedThreadId);    var infoTask = TaskCaller().Result;    var infoTaskFinished = string.Format("api执行线程(task调用完成后):{0}", Thread.CurrentThread.ManagedThreadId);    return string.Format("{0},{1},{2}", info, infoTask, infoTaskFinished);}private async Task
TaskCaller(){ await Task.Delay(500); return string.Format("task 执行线程:{0}", Thread.CurrentThread.ManagedThreadId);}

代码执行流程

执行原理

输出结果如下

result

async & await

如果使用await,在调用 await taskcall() 时不会阻塞get主方法线程,主方法线程会被释放,新的线程执行完成task后继续执行await后的代码减少线程切换开销,而之前的线程则空闲了。

[HttpGet]public async Task
Get(){ var info = string.Format("api执行线程:{0}", Thread.CurrentThread.ManagedThreadId); var infoTask = await TaskCaller(); var infoTaskFinished = string.Format("api执行线程(task调用完成后):{0}", Thread.CurrentThread.ManagedThreadId); return string.Format("{0},{1},{2}", info, infoTask, infoTaskFinished);}private async Task
TaskCaller(){ await Task.Delay(500); return string.Format("task 执行线程:{0}", Thread.CurrentThread.ManagedThreadId);}

代码执行流程

执行流程

输出结果如下

await

总结

Task.result 与 await关键字 具有类似的功能可以获取到任务的返回值,但是本质上Task.result会让外层函数执行线程阻塞直到任务执行完成,而使用await关键字外层函数线程则不会阻塞,而是通过任务执行线程来执行await后的代码。


作者:帅虫哥 出处:

转载于:https://www.cnblogs.com/vipyoumay/p/5663950.html

你可能感兴趣的文章
python在类中实现swith case功能
查看>>
leetcode Sort List
查看>>
Maven com.sun.jdmk:jmxtools:jar 下载不下来
查看>>
DevExpress之Skin自定义使用
查看>>
可变参数
查看>>
[日推荐]『饿了么外卖服务』饿了么官方小程序,无需下载安装!
查看>>
JavaScript 作用域
查看>>
Linux Ubuntu 16.04 主机名设置
查看>>
CCNP 静态路由
查看>>
单链表二[不带头节点链表]
查看>>
Spring mvc 拦截器
查看>>
MySQL GROUP BY 和GROUP_CONCAT的一些用法
查看>>
关于box2d的例子testbed
查看>>
## mysqldump 导出数据库各参数详细说明
查看>>
java中URL编码和中文相互转换
查看>>
影评:《云图》:生命并非微不足道
查看>>
hibernate4之一对一关系映射(二)
查看>>
我的友情链接
查看>>
Android第五课 编译错误分析
查看>>
VS_远程调试
查看>>