在String上使用Threading :: Monitor时出现SynchronizationLockException

时间:2016-01-12 11:18:32

标签: multithreading winforms visual-c++ locking

我认为在String上使用Monitor :: TryEnter和Monitor :: Exit时遇到问题(我想这是个问题,但我正在寻找一些额外的信息)。

    if (Monitor::TryEnter(m_sLogFile, 200)) {
        try {
            m_sLogFile = IO::Path::GetDirectoryName(Application::ExecutablePath) + "\\" + LOG_FILE_DEFAULT;
            // SOME EXTRA CODE
        }
        finally {
            Monitor::Exit(m_sLogFile);
        }
    }

[m_sLogFile是我班级中声明的字符串]

在Monitor :: Exit调用上抛出 SynchronizationLockException ,并显示以下消息:

  

从非同步块调用对象同步方法   代码

我想确定错误是我们正在锁定字符串,我们正在更改其内容。

1 个答案:

答案 0 :(得分:1)

问题不在于您使用string Monitor.Enter/Exit,问题是您使用一个字符串Enter Exit的另一个

if (Monitor::TryEnter(m_sLogFile, 200)) {
    try {
        m_sLogFile = IO::Path::GetDirectoryName(Application::ExecutablePath) + "\\" + LOG_FILE_DEFAULT;
            // SOME EXTRA CODE
    }
    finally {
        Monitor::Exit(m_sLogFile);
    }
}

请参阅内部的m_sLogFile = ....

你需要使用一个不会改变的字段(像readonly object m_Lock;这样的字段就足够了。)