多執行緒環境中的事件調度安全
在多執行緒環境中,建議的事件調度方法包括在呼叫之前檢查事件無效性。然而,這引起了對潛在競爭條件的擔憂,即另一個執行緒修改空檢查和事件呼叫之間的呼叫清單。
為了解決這個問題,建議的解決方案包括為事件創建一個受保護的虛擬方法,如下所示:
protected virtual void OnSomeEvent(EventArgs args) { EventHandler ev = SomeEvent; if (ev != null) ev(this, args); }
此方法透過將多播委託從事件複製到臨時變數來確保線程安全。對事件的任何後續更改都不會影響複製的委託,從而允許安全測試和呼叫。
但是,此解決方案僅解決與空事件相關的競爭條件。它不處理事件處理程序引用無效狀態或複製後訂閱的情況。對於事件並發問題的全面解決方案,建議查看外部資源,例如 Eric Lippert 的部落格文章和引用的 StackOverflow 問題。
在 C# 6.0 環境中,使用 Krzysztof 的方法可以進一步增強事件調度的安全性。
以上是在多執行緒 C# 應用程式中調度事件時如何確保執行緒安全?的詳細內容。更多資訊請關注PHP中文網其他相關文章!