首頁 > 後端開發 > C++ > 為什麼不能在 C# 中的 `lock` 語句中使用 `await`?

為什麼不能在 C# 中的 `lock` 語句中使用 `await`?

Mary-Kate Olsen
發布: 2025-01-15 11:12:45
原創
380 人瀏覽過

Why Can't You Use `await` Inside a `lock` Statement in C#?

C# 中lock語句內禁止使用await的原因

在 C# 中,await 運算子不能在 lock 語句內使用,這是編譯器團隊刻意做出的設計選擇。雖然實現此功能並非難事,但它被認為是一種危險的做法,容易導致死鎖。

限制背後的原因

lock 語句中允許使用 await 會導致在 await 釋放控制權和方法隨後復原之間執行任意程式碼。此程式碼可能會以與原始鎖層次結構衝突的順序取得鎖,從而導致死鎖。

此外,await 可能會在與最初取得鎖的執行緒不同的執行緒上恢復執行。這會導致在與獲取鎖的線程不同的線程上解鎖鎖的可能性,這是非常不希望的。

對自訂鎖定實現的影響

嘗試使用自訂鎖定實作(例如給定程式碼範例中提供的實作)來規避此限制可能會導致不可預測且可能容易出現死鎖的行為。這是因為,如果在 await 操作進行時另一個執行緒取得了鎖,則 ExitDisposable 類別中的 Monitor.Exit 呼叫可能會無限期阻塞。

結論

雖然 await 運算子提供了強大的非同步程式設計功能,但必須了解遵循建議的最佳實踐(包括禁止在 lock 語句中使用 await)的重要性。此限制旨在防止死鎖,並確保多執行緒程式碼的安全性和可靠性。

以上是為什麼不能在 C# 中的 `lock` 語句中使用 `await`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板