一直認為異步效率比同步要好,今天看了下其實不是所有需求都適用於異步,啥時候用同步異步如下:
滿足以下條件時使用同步管線:
1,操作很簡單或運行時間很短。
2,簡單性比效率更重要。
3,此操作主要是 CPU 操作而不是包含大量的磁盤或網絡開銷的操作。 對 CPU 綁定操作使用異步操作方法未提供任何好處並且還導致更多的開銷。
在滿足以下條件時使用異步管線:
1,操作是網絡綁定的或 I/O 綁定的而不是 CPU 綁定的。
2,測試顯示阻塞操作對於網站性能是一個瓶頸,並且通過對這些阻塞調用使用異步操作方法,IIS 可對更多的請求提供服務。
3,並行性比代碼的簡單性更重要。
4,您希望提供一種可讓用戶取消長時間運行的請求的機制
在使用異步操作的時候需要占用更多的資源,因為一個線程在理論上好像是2m,如果在在整個應用程序中用異步太多將會出現內存不足,從而出現503錯誤(服務器正忙),所以在使用異步的時候也要慎用,假如一定要是用也是為了在程序中增加性能等,參照上序何時使用同步與異步
在asp.net mvc中使用異步控制器:
控制器繼承AsyncController ,AsyncController擁有所有Controller的特性,所以在控制器中AsyncController同樣可以實現同步,實現異步的action需要以xxxAsync開始,以xxxComleted呈現給頁面,視圖命名為xxx.aspx,也不是xxxAsync.aspx,更同步命名是一樣的
public class HomeController : AsyncController { public void IndexAsync() { AsyncManager.OutstandingOperations.Increment(2);//兩個異步 AsyncManager.Parameters["name"] = "objectboy"; AsyncManager.OutstandingOperations.Decrement(); AsyncManager.Parameters["age"] = "25"; AsyncManager.OutstandingOperations.Decrement(); } public ActionResult IndexCompleted(string name,string age) { return Content(name+age); } }
AsyncManager: 為AsycController 類提供異步操作。
OutstandingOperations:獲取未完成操作的數目。
我的事例上通過Parameters的形式傳遞值,將name,age兩個參數傳遞給xxxCompleted呈現,運行后結果為 :objectboy25