ConfigureAwait(false)


from:https://www.cnblogs.com/zzqvq/p/10252746.html



昨天在做項目的時候,用的dapper查數據用的QueryAsync 異步方法。給上級做代碼審核時,上級說最好加上ConfigureAwait(false).能減少一些性能開銷。
因為之前沒用過所以看了 clr via c# 26 27章,以及參考網上資料。這里打算做個總結,什么情況下該使用這個。什么時候不使用這個

var title=await GetTitleAsync(5).ConfigureAwait(false);

1|0ConfigureAwait(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。

2|0什么時候該使用?

綜上所述,如果你的異步方法,以及異步后的方法不涉及上下文操作,即加上ConfigureAwait(false),這樣可以減少性能開銷.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM