TTG*_*oup 2 c++-cli managed visual-studio
我正在使用 Monitor 类来管理关键部分。但有时我会遇到SynchronizationLockException以下消息
An unhandled exception of type 'System.Threading.SynchronizationLockException' occurred in ManagedType.dll
Additional information: Object synchronization method was called from an unsynchronized block of code.
Run Code Online (Sandbox Code Playgroud)
我的代码在下面
Object^ lockObj = gcnew Object(); //Global variable
bool GetValue()
{
try
{
Monitor::Enter(lockObj);
return this.value;
}
finally
{
Monitor::Exit(lockObj);
}
}
Run Code Online (Sandbox Code Playgroud)
在SynchronizationLockException抛出时Monitor::Exit(lockObj)调用。
我已经在这个论坛和互联网上搜索过,但包括 MSDN 在内的大多数主题都说“当您尝试在 Monitor.Enter() 和 Monitor.Exit() 中使用值类型变量而不是引用类型时,将抛出此异常”。
但就我而言,我使用 lockObj 作为引用对象。所以我不知道为什么它会抛出这个异常。有人可以帮助我吗?
非常感谢,
T&T集团!
发布的代码从根本上是错误的。Monitor::Enter() 调用必须出现在 try{} 块之外。
故障模式令人讨厌且无法诊断。如果 Enter() 调用因任何原因抛出异常,则 finally{} 块中的 Exit() 调用将因记录的异常而崩溃,因为从未进入监视器。这是不可诊断的,因为该异常取代了不可了 Enter() 方法抛出的异常,您看不到它,也无法捕获原始异常。所以你不知道为什么这段代码失败并且无法解决问题。
将 Enter 调用移到 try 块上方。这仍然不能解决您的代码崩溃的问题,但至少您现在可以获得一些关于真正出错的信息。
顺便说一句,请注意 .NET 4.0 中添加的 Monitor::Enter() 重载,旨在解决此类问题。它需要一个额外的 bool% 参数,当 Enter() 成功时,该参数将设置为 true,因此您知道调用 Exit() 是安全的。
| 归档时间: |
|
| 查看次数: |
3231 次 |
| 最近记录: |