回答
鎖定foo
是個壞主意,因爲每次值都會改變。您應該鎖定在其不變化的變量:
private readonly object eventLock = new object();
private EventHandler fooHandler;
public event EventHandler Foo
{
add
{
lock (eventLock)
{
fooHandler += value;
}
}
remove
{
lock (eventLock)
{
fooHandler -= value;
}
}
}
private void OnFoo(EventArgs e)
{
EventHandler handler;
lock (eventLock)
{
handler = fooHandler;
}
if (handler != null)
{
handler(this, e);
}
}
需要注意的是,如果你使用類似字段的事件,像這樣:
public event EventHandler Foo;
那麼你會自動獲得一個「在添加/刪除時鎖定(this)「,儘管您在調用處理程序之前必須手動添加它(假設您要確保讀取最近寫入的值)。就我個人而言,我不是鎖定「this」的粉絲,但你可能不介意 - 它確實使代碼更簡單。
@Jon,我正在使用類似場景的事件,所以我不需要鎖定添加/刪除,我是對嗎? – Benny 2010-02-05 08:17:54
@Jon,我直接調用了事件處理函數,像這樣foo(),不會從事件中獲取處理函數,我應該添加鎖嗎? – Benny 2010-02-05 08:24:42
@Benny:如果你使用的是類似場景的事件,你不需要*添加/刪除來鎖定。如果你直接調用事件處理程序,你如何防止它爲空?請注意,您不能只使用'if(foo!= null){foo(...); }'as'foo'可以在測試後變成* null。也不能保證你會得到最新的值 - 這就是爲什麼我在我的'OnFoo'方法中獲得鎖定的原因。 (內存模型可以做些有趣的事情......) – 2010-02-05 08:26:40
- 1. 我應該在dlopen之前鎖定嗎?
- 2. 我可以在Rails中鎖定表嗎? (我應該嗎?)
- 3. 我應該使用事件嗎?
- 4. 我應該使用喚醒鎖嗎?
- 5. 我應該在C#中讀取文件之前鎖定文件嗎?
- 6. 我應該互斥鎖定一個變量嗎?
- 7. 我應該在多線程範例中鎖定數據表嗎?
- 8. android複製保護向前鎖定 - 我應該不打擾嗎?
- 9. 我應該使用MySQL的自定義'鎖'表嗎?
- 10. Git(LFS):什麼是鎖定支持?我應該啓用它嗎?
- 11. 硬件鎖定許可:我應該使用哪些硬件?
- 12. iOS鎖定事件?
- 13. 事件處理程序應該直接響應事件嗎?
- 14. 我應該嘗試將asp控件事件放入BLL中嗎?
- 15. 響應設備鎖定時的事件
- 16. clSetEventCallback,應該明確保留事件嗎?
- 17. EventHandler應該總是用於事件嗎?
- 18. NSLock - 鎖定鎖定鎖時應該阻止?
- 19. 這應該稱爲互斥鎖嗎?
- 20. 應該在ReaderWriterLockSlim鎖上調用Dispose()嗎?
- 21. 我可以從我的應用鎖定iPhone原生應用嗎?
- 22. 我應該刪除監聽器的SOUND_COMPLETE事件嗎?
- 23. 我應該從TransactionScope TransactionCompleted事件註銷嗎?
- 24. 我應該公開行動而不是事件嗎?
- 25. 我應該刪除一個事件處理程序嗎?
- 26. d3.js我應該退出/移除事件監聽器嗎?
- 27. 取消我的android應用程序上的鎖定/解鎖事件
- 28. 確定對象何時準備就緒。我應該使用事件嗎?
- 29. Bitlocker:鎖定或解鎖事件
- 30. 我應該使用表鎖還是事務?
喬恩的回答很好,但在回答之前,我會推回去問爲什麼你首先要做鎖定。 *你相信你有什麼問題,你爲什麼認爲鎖定解決了它?*我可以想到多線程事件可能存在的多個問題;你會根據你擔心的問題使用不同的鎖定技術。 – 2010-02-05 18:24:54