如何避免SynchronizationLockException?

时间:2011-01-21 14:04:12

标签: c# multithreading

我有以下代码,我基于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成功。如何删除此错误?

1 个答案:

答案 0 :(得分:8)

我的猜测是deployIsRunningbool类型的变量或其他一些值类型。您拨打TryEnterExit的电话会设置该值,每次都会创建一个新对象。

基本上,只能使用引用类型变量来锁定。