簡體   English   中英

C#為什么我的鎖聲明掛了?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM