【问题标题】:How do I avoid a SynchronizationLockException?如何避免 SynchronizationLockException?
【发布时间】:2011-01-21 14:04:12
【问题描述】:

我有以下代码,它基于Monitor class example on the msdn website

    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 并显示错误消息:“对象同步方法是从未同步的代码块中调用的。”错误的解释是我试图释放一个我不拥有的互斥锁,但我无法进入调用Exit 的代码块,除非TryEnter 成功。如何消除此错误?

【问题讨论】:

    标签: c# multithreading


    【解决方案1】:

    我的猜测是deployIsRunningbool 类型的变量或其他值类型。您对TryEnterExit 的调用会将值装箱,每次都会创建一个新对象。

    基本上,只对锁使用引用类型变量。

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 2013-02-12
      • 1970-01-01
      • 2011-05-15
      • 2014-05-30
      • 2022-01-26
      • 2014-10-15
      • 2013-07-16
      • 2013-03-03
      相关资源
      最近更新 更多