協程, 是 爲了 避免 閉包傳遞變量 的 性能損耗 而產生 。設計模式
若是不是 爲了 避免 閉包傳遞變量 的 性能損耗 , 線程池 和 Task 已經夠了, 不須要 再設計 出 協程 來 。閉包
閉包, 會 讓 全部共享 的 變量 變成 引用 訪問 的 方式,包括 值變量 。架構
由於 閉包 是將 變量 放到 堆 裏 共享 。async
協程 就是在 堆 裏 模擬出一個 堆棧 和 協程「上下文」 存儲區, 這和 操做系統 的 線程 堆棧 和 上下文 架構 是 類似 的 。函數
上下文存儲區 保存 每一個 協程 的 堆棧 的 棧頂 棧底, 在 切換 協程 時, 將 棧頂 棧底 存入 CPU 寄存器, 性能
這樣, 代碼 中 對 變量 的 訪問 就能夠 和 線程 同樣, 經過 編譯在 指令中 的 偏移量 操做數 加上 棧底 的 地址 就能夠獲得 變量 的 地址 。spa
這樣 對 函數 局部變量 的 訪問 就和 線程 同樣 , 指令 偏移量 操做數 + 棧底 , 這樣 一次 尋址 。操作系統
避免了 閉包 將 變量 變成 引用訪問 的 二次尋址 帶來 的 性能損耗 。線程
因此, C# 的 async await 自己 就 包含了 一個 協程 的 實現, 這大概也是 C# async await 要經過 編譯器 把 代碼 編譯爲 狀態機 而不是 Task.ContinueWith() 的 緣由 。設計
協程 須要 編譯器 在 彙編 層面 實現, 不能 經過 高級語言 的 類庫 / 封裝 / 設計模式 的 方式實現 。
InnerC 還不能 描述 協程, 能夠考慮 給 InnerC 增長 協程 的 語法支持 。
在 現階段, 協程 是一個 有 技術含量 和 競爭力 的 技術 。