一般来说,如果一个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));的意义就不大了。同步和异步有着同样的效率。