我认为在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 ,并显示以下消息:
从非同步块调用对象同步方法 代码
我想确定错误是我们正在锁定字符串,我们正在更改其内容。
答案 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;
这样的字段就足够了。)