如何避免SynchronizationLockException?

4
我有以下代码,它是基于 msdn网站上的Monitor类示例
    private void WebRefresh_Click(object sender, EventArgs e)
    {
    if (WebRefresh.Enabled)//Only call from button
    {
        if (System.Threading.Monitor.TryEnter(deployIsRunning))
        {

                refreshWebVersion();

                System.Threading.Monitor.Exit(deployIsRunning);
        }
    }
    else
    {
        MessageBox.Show("You cannot refresh during a deploy");
    }
}

这段代码在调用Monitor.Exit()时抛出SynchronizationLockException,并显示错误信息:"Object synchronization method was called from an unsynchronized block of code." 这个错误的解释是我试图释放一个我没有拥有的互斥锁,但是除非TryEnter成功,否则我无法进入调用Exit的代码块。如何消除这个错误?
1个回答

8
我的猜测是deployIsRunning是一个bool或其他值类型的变量。你对TryEnterExit的调用将会装箱该值,每次都会创建一个新对象。
基本上,只有在锁定时使用引用类型变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接