• web api接口同步和异步的问题


    一般来说,如果一个api 接口带上Task和 async 一般就算得上是异步api接口了。

    如果我想使用异步api接口,一般的动机是我在我的方法里面可能使用Task.Run 进行异步的去处理一个耗时的操作。

    Q1.如果一个api接口很耗时,比如需要10s,会影响我的前端展示吗?

       --不会。很多js可以异步请求api接口,当接口返回数据时,通过回调方法,显示数据。

    Q2.对于存在耗时的api接口,使用异步api接口(接口内部可能使用 Task.Run 异步操作)一定可以提高响应吗?

      --不一定。举个例子:

       

    public async Task<IEnumerable<string>> Get(string s)
            {
    
                Log.InfoFormat(ITCloudLogType.common, "Begin Request.thread id:{0},time:{1},requestId:{2}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToLongTimeString(), this.ControllerContext.Request.GetCorrelationId().ToString());
    
    
               await Task.Run(()=>Job1(s));
    
                Log.InfoFormat(ITCloudLogType.common, "End Request.id:{0},time:{1},requestId:{2}", Thread.CurrentThread.ManagedThreadId, DateTime.Now.ToLongTimeString(), this.ControllerContext.Request.GetCorrelationId().ToString());
                return new string[] { "value1", "value2" };
            }
            
    
    
            private void Job1(string s)
            {
                 return;
            }
    
            private int Job2()
            {
                return 2;
            }

         情况1.假定Job1非常耗时,而且Job1的结果对下文的结果输出并没有什么影响,这个时候如果使用

         await Task.Run(()=>Job1(s)); 就显得非常不明智。可以去掉await关键字,把Job1放在一个异步的现场中去执行,而程序继续往下走,避免不必要的等待,对接口加速。

    情况2. 更为常见的:Job1的结果是下文所需要的
    这种情况下,使用await Task.Run(()=>Job1(s));的意义就不大了。同步和异步有着同样的效率。
  • 相关阅读:
    Spring中的Type学习
    Spring发布监听机制
    BeanFactory父子容器的知识
    Spring中自动创建代理器
    ProxyConfig属性详解
    BeanFactoryAdvisorRetrievalHelper:从Bean工厂检索出Advisor们
    代理机制
    Spring AOP组件
    @Value的使用
    BeanPostProcessor原理--使用讲解
  • 原文地址:https://www.cnblogs.com/zzPrince/p/5922011.html
Copyright © 2020-2023  润新知