【发布时间】:2010-08-25 09:09:27
【问题描述】:
考虑以下实现仅对一个线程的非阻塞访问的函数。
public bool TryCancelGroup()
{
if (Monitor.TryEnter(_locked))
{
if (_locked == false)
{
_locked = true;
try
{
// do something
}
catch (Exception ex)
{
_locked = false;
}
finally
{
Monitor.Exit(_locked);
}
}
return _locked;
}
else
{
return false;
}
}
这是_locked 变量的定义方式。
bool _locked = false;
现在当程序到达Monitor.Exit(_locked); 时,它会抛出一个System.Threading.SynchronizationLockException,表示_locked 变量之前没有同步。
在 _locked 变量被定义为对象之前,这一切都在工作
object _locked = new object();
当我将其更改为 bool 以将其用作布尔标志时,我开始收到此异常。
【问题讨论】:
-
JaredPar 为您的问题提供了答案。但是您的逻辑似乎有缺陷-如果您使用 _locked = true 进入监视器,那么您将永远不会退出监视器。
-
哦当然可以,谢谢VinayC
-
另外我认为你通常有一个静态对象作为你的锁。
-
@Chris。不是我的情况。我需要为类实例而不是类类型提供同步。因此我不需要静态锁定对象。
-
酷。我确实认为可能是这种情况,但想检查它不仅仅是一个错字或什么的。 :)
标签: c# .net multithreading locking