一般來說,如果一個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));的意義就不大了。同步和異步有着同樣的效率。