[英]C# Why is my lock statement hanging?
我已經學習了一些關於如何創建custem事件訪問器的教程。 這是我的代碼:
event ControlNameChangeHandler IProcessBlock.OnControlNameChanged
{
add
{
lock (ControlNameChanged)
{
ControlNameChanged += value;
}
}
remove
{
lock (ControlNameChanged)
{
ControlNameChanged -= value;
}
}
}
目前代碼在add statament中達到lock(ControlNameChanged)
,沒有任何反應。 代碼不再運行。 但是我的申請仍然有效。 它不凍結或什么的。
出了什么問題?
不知何故,其他人持有鎖。 您不應該使用多播委托實例或事件來進行鎖定,也不應該使用公共成員,因為您無法控制誰鎖定以及何時鎖定。
因此我會使用這樣的單獨鎖定對象:
private readonly object controlNameChangedSync = new object();
event ControlNameChangeHandler IProcessBlock.OnControlNameChanged
{
add
{
lock (controlNameChangedSync)
{
ControlNameChanged += value;
}
}
remove
{
lock (controlNameChangedSync)
{
ControlNameChanged -= value;
}
}
}
注意:在委托上執行+=
或-=
時,對事件的引用會發生更改。
你的代碼相當於
event ControlNameChangeHandler IProcessBlock.OnControlNameChanged {
add {
try {
Monitor.Enter(ControlNameChanged);
ControlNameChanged = ControlNameChanged + value;
}
finally {
Monitor.Exit(ControlNameChanged);
}
}
remove {
try {
Monitor.Enter(ControlNameChanged);
ControlNameChanged = ControlNameChanged - value;
}
finally {
Monitor.Exit(ControlNameChanged);
}
}
}
請注意,您退出的對象與您輸入的對象不同。 這意味着你有一個鎖從未被釋放,一個鎖被釋放但從未被取走。 您應該將代碼更改為:
private object padlock = new object();
event ControlNameChangeHandler IProcessBlock.OnControlNameChanged {
add {
lock (padlock) {
ControlNameChanged += value;
}
}
remove {
lock (padlock) {
ControlNameChanged -= value;
}
}
}
+=
和-=
運算符更改委托。 因此,每次添加和刪除方法都鎖定在不同的對象上,並且根本沒有同步。
現在這不能解釋阻塞,但你的問題並不是很清楚實際發生了什么。 我希望程序能夠“正常”執行並具備競爭條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.