首页 > 代码库 > web api接口同步和异步的问题

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));的意义就不大了。同步和异步有着同样的效率。

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