在 TransactionScope 中使用 await 會發生 「TransactionScope 必須在當初建立所在的執行緒上進行配置」錯誤訊息,本文以此錯誤來檢視 async / await 機制與流程,並且透過設定來排除 Task 或 async/await 這類非同步作業所產生的跨執行續交易問題。
2017-10-12
在 TransactionScope 中使用 await 會發生 「TransactionScope 必須在當初建立所在的執行緒上進行配置」錯誤訊息,本文以此錯誤來檢視 async / await 機制與流程,並且透過設定來排除 Task 或 async/await 這類非同步作業所產生的跨執行續交易問題。
面對大量且重要性低的 LOG 紀錄需求(如:統計功能使用量),可以考慮套用非同步射後不理機制來節省 Web API 被占用的時間,把資源留給其他更重要的項目;文末並針對 SynchronizationContext 議題進行探討,由於在這種情境下會有 context 消失問題存在,因此需設定 ConfigureAwait(false) 來讓後續作業順利進行。
測試過程中發現若使用 ProfiledDbConnection 包裝原本 DB 連線後,預期的非同步效果就會消失,感覺似乎在每筆 DB 查詢後都立即 await 獲得資料,因此在上線時除了關閉 NanoProfiler 結果頁外,也要記得調整回系統原本的 DB 連線方式。
在 Web API 執行過程中可能需要一次對資料庫提出數個操作需求,當這些查詢彼此沒有順序相依性時,就可以善用非同步的機制讓所有查詢盡可能一次送出,而最終只需花費單一最長查詢所需要的時間即可獲得所有查詢的結果,對於效能的提升相當有幫助。