C# 中lock
語句內禁止使用await
的原因
在 C# 中,await
運算子不能在 lock
語句內使用,這是編譯器團隊刻意做出的設計選擇。雖然實現此功能並非難事,但它被認為是一種危險的做法,容易導致死鎖。
限制背後的原因
在 lock
語句中允許使用 await
會導致在 await
釋放控制權和方法隨後復原之間執行任意程式碼。此程式碼可能會以與原始鎖層次結構衝突的順序取得鎖,從而導致死鎖。
此外,await
可能會在與最初取得鎖的執行緒不同的執行緒上恢復執行。這會導致在與獲取鎖的線程不同的線程上解鎖鎖的可能性,這是非常不希望的。
對自訂鎖定實現的影響
嘗試使用自訂鎖定實作(例如給定程式碼範例中提供的實作)來規避此限制可能會導致不可預測且可能容易出現死鎖的行為。這是因為,如果在 await
操作進行時另一個執行緒取得了鎖,則 ExitDisposable
類別中的 Monitor.Exit
呼叫可能會無限期阻塞。
結論
雖然 await
運算子提供了強大的非同步程式設計功能,但必須了解遵循建議的最佳實踐(包括禁止在 lock
語句中使用 await
)的重要性。此限制旨在防止死鎖,並確保多執行緒程式碼的安全性和可靠性。
以上是為什麼不能在 C# 中的 `lock` 語句中使用 `await`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!