为什么async/await方法不能有lock或Monitor
????????相信有不少朋友知道async/await有l(wèi)ock語法的情況一般都會編譯錯誤,這個時候可以通過Monitor來解決編譯錯誤的問題;雖然這樣解決的編譯錯誤但本質(zhì)問題還是沒有解決。
????????其實并不是async/await方法不能用lock或Monitor,而是在lock或Monitor的作用域內(nèi)是不能使用awaiter功能。最主要原因是await后面代碼執(zhí)行線程非常大的機率不是Monitor.Enter線程,所以在執(zhí)行Monitor.Exit的是會異常的。lock或Monitor要求鎖和解鎖對象時都必須是同一線程處理,而await其實只是個異步狀態(tài)機,它后面的代碼觸發(fā)線程是異常步回調(diào)線程,所以是無法釋放對象鎖的。
????????但有時候個別async/await需要同步執(zhí)行怎辦?那可以使用線程信號量來解決。通過SemaphoreSlim對象可以方便解決方法同步運行問題,詳細可查看
https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.semaphoreslim?view=net-5.0
BeetleX開源跨平臺通訊框架(支持TLS)
提供高性能服務和大數(shù)據(jù)處理解決方案
https://beetlex.io
總結(jié)
以上是生活随笔為你收集整理的为什么async/await方法不能有lock或Monitor的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .Net Core with 微服务 -
- 下一篇: NET问答: 为什么仅有 getter