Net Core WebAPI

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

Task.Result

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

[HttpGet]
public static async Task<JObject> 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<string> TaskCaller()
{
await Task.Delay(500);
return string.Format("task 执行线程:{0}", Thread.CurrentThread.ManagedThreadId);
}

代码执行流程

输出结果如下

async & await

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

[HttpGet]
public async Task<string> 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<string> TaskCaller()
{
await Task.Delay(500);
return string.Format("task 执行线程:{0}", Thread.CurrentThread.ManagedThreadId);
}

代码执行流程

输出结果如下

总结

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


以上内容有任何错误或不准确的地方请大家指正,不喜勿喷!

作者:帅虫哥 出处: http://www.cnblogs.com/vipyoumay/p/5663950.html

最新文章

  1. XVII Open Cup named after E.V. Pankratiev. GP of SPb
  2. OSI七层与TCP/IP五层网络架构详解
  3. 那些教程没有的php1-基础知识补漏
  4. 重绘Winform窗体
  5. (medium)LeetCode 233.Number of Digit One
  6. Intellij编译时报“java: System Java Compiler was not found in classpath” 解决办法
  7. C# DataTable转换成DataRow
  8. [转载] python+Eclipse+pydev环境搭建
  9. Eclipse 配置SSH 详解
  10. HTTP请求和数据安全
  11. mob分享
  12. ffmpeg批量实现视频转码命令行
  13. Python-函数-Day4
  14. Eclipse的DEgub调试乱跳
  15. rabbitmq 生产者 消费者(多个线程消费同一个队列里面的任务。) 一个通用rabbitmq消费确认,快速并发运行的框架。
  16. 【Spark调优】:尽量避免使用shuffle类算子
  17. ural1517
  18. Windows下利用TortoiseSVN搭建本地SVN服务器
  19. How to become a successful bug bounty hunter
  20. python 虚拟环境 pyenv

热门文章

  1. JavaSE思维导图(七)
  2. SQL Server2008不允许修改表结构解决办法
  3. English - 英语中的时间表达法,这里全啦!
  4. 通过git和Xcode将代码上传到GitHub
  5. STL模板_map
  6. C++_基础_运算符重载2
  7. Qt(QML)本地化
  8. codeforces 632E. Thief in a Shop fft
  9. BZOJ 1196 [HNOI2006]公路修建问题(二分答案+并查集)
  10. D3.js学习记录【转】【新】