我正在尋找爲什麼Microsoft建議的對象編碼事件訪問語法時鎖定的其他信息。微軟的代碼示例如下所示,並且建議被鏈接到。多線程的擔憂時編碼事件訪問
我理解有關鎖定一段代碼以控制對其的多線程訪問的一般概念,但是我正在尋找特定的原因,以便在Microsoft的上下文中編寫自定義事件訪問器邏輯示例顯示。
以下示例說明如何實現自定義添加和刪除事件訪問器。儘管您可以替換 訪問器中的任何代碼,但我們建議您在添加事件之前先鎖定事件,或者刪除新的事件處理程序方法。
event EventHandler IDrawingObject.OnDraw
{
add
{
lock (PreDrawEvent)
{
PreDrawEvent += value;
}
}
remove
{
lock (PreDrawEvent)
{
PreDrawEvent -= value;
}
}
}
〜通過https://msdn.microsoft.com/en-us/library/bb882534.aspx?f=255&MSPPError=-2147217396
在事件發生的同時,事件句柄是否可以被移除?會猜測這可能會導致空引用異常。 –
我不是100%確定,但我認爲這是因爲一個事件基本上是一個多播委託。因此,當您添加/刪除處理程序時,實際會創建* new *委託。所以,它實際上是一個兩步操作:生成新的委託,並分配給現有的變量。如果多個線程同時(不)訂閱,那麼會引入競爭條件的窗口。 –
還有一點需要注意的是,由於上述原因,我認爲鎖定正在修改的事件將會是一個糟糕的形式。有一個專門的鎖對象似乎更明智。 –