0

我觉得我可能在这里重新发明轮子。这是我想要实现的目标:

当使用lockor锁定对象时Monitor.Enter,我想收到通知。同样,当对象被释放时,我想要一个通知。

我正在考虑编写一个包装类,该类公开一个可观察的发送通知,以及一些获取/释放锁的方法。但是,就像我提到的那样,我觉得我可能正在重做一些已经存在的事情。在不编写新类的情况下,我可以使用任何 .NET 技术来实现这一目标吗?

编辑:回答一些问题:为什么?在尝试执行之前,我需要知道一段代码何时忙碌。假设我们在 UI 上有两个按钮,A 和 B。A 执行方法 A,B 执行方法 B。他们都使用相同的对象来锁定/同步。当我看到有人已经在执行一段被同步对象实例 _syncObject 锁定的代码时,我想禁用这些按钮。我想给用户一个指示,该功能目前无法执行。

Monitor.TryEnter 或尝试验证锁是否可用不是解决方案,因为它需要轮询并且不是通知。

void methodA()
{
lock(_syncObject)
{
...
}
}

void methodB()
{
{
lock(_syncObject)
{
...
}
}
4

2 回答 2

0

您将收到的唯一“通知”是Monitor已锁定或已解锁。例如:

   bool lockTaken;
   Monitor.Enter(lockObject, ref lockTaken);
   if(!lockTaken) Console.WriteLine("Already locked");
   else Console.WriteLine("Not already locked.");

监视器和其他同步对象旨在控制线程,而不是用于通知。如果您想要通知发生的事情,请创建事件并引发它们——这就是事件的用途。

于 2013-04-03T16:41:03.873 回答
0

目前尚不清楚您要做什么。如果您想要某个线程正在执行受保护的代码段的通知,您可以创建一组事件,以便代码段开始后,您可以触发代码正在执行的事件......最后相同,只是在释放锁之前。

于 2013-04-03T16:38:14.640 回答