• Net Core WebAPI


    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);
    }

    代码执行流程

    执行原理

    输出结果如下

    result

    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);
    }
    

    代码执行流程

    执行流程

    输出结果如下

    await

    总结

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


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

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

  • 相关阅读:
    15个华丽的扁平风格的登录界面设计示例
    12款很酷的使用大头照的国外名片设计作品
    高清壁纸下载:15款精美的2014年元旦桌面壁纸
    Harp – 内置常用预处理器的静态 Web 服务器
    分享245款高质量的图标素材【免费下载】
    经典网页设计:关注用户体验的20个华丽网站
    使用 CSS3 实现超炫的 Loading(加载)动画效果
    你知道网页设计中最常用的15张图片素材吗?
    Koa – 更加强大的下一代 Node.js Web 框架
    Myth – 支持变量和数学函数的 CSS 预处理器
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/5668413.html
Copyright © 2020-2023  润新知