昨天在做項目的時候,用的dapper查數據用的QueryAsync 異步方法。給上級做代碼審核時,上級說最好加上ConfigureAwait(false)
.能減少一些性能開銷。
因為之前沒用過所以看了 clr via c# 26 27章,以及參考網上資料。這里打算做個總結,什么情況下該使用這個。什么時候不使用這個
var title=await GetTitleAsync(5).ConfigureAwait(false);
ConfigureAwait(true) 和 ConfigureAwait(false)的區別
一個是在異步執行時捕獲上下文,一個是在異步執行時不捕獲上下文.
1.當ConfigureAwait(true),代碼由同步執行進入異步執行時,當前同步執行的線程上下文信息(比如HttpConext.Current,Thread.CurrentThread.CurrentCulture)就會被捕獲並保存至SynchronizationContext中,供異步執行中使用,並且供異步執行完成之后(await之后的代碼)的同步執行中使用(雖然await之后是同步執行的,但是發生了線程切換,會在另外一個線程中執行「ASP.NET場景」)。這個捕獲當然是有代價的,當時我們誤以為性能問題是這個地方的開銷引起,但實際上這個開銷很小,在我們的應用場景不至於會帶來性能問題。
2.當Configurewait(flase),則不進行線程上下文信息的捕獲,async方法中與await之后的代碼執行時就無法獲取await之前的線程的上下文信息,在ASP.NET中最直接的影響就是HttpConext.Current的值為null。
什么時候該使用?
綜上所述,如果你的異步方法,以及異步后的方法不涉及上下文操作,即加上ConfigureAwait(false)
,這樣可以減少性能開銷.