【发布时间】:2013-04-04 01:43:35
【问题描述】:
我觉得我可能在这里重新发明轮子。这是我想要实现的目标:
当使用lock 或Monitor.Enter 锁定对象时,我希望收到通知。同样,当对象被释放时,我希望收到通知。
我正在考虑编写一个封装类,该类公开一个可观察对象以发送通知,以及几个获取/释放锁的方法。但是,就像我提到的那样,我觉得我可能正在重做一些已经存在的事情。在不编写新类的情况下,我可以使用任何 .NET 技术来实现这一目标吗?
编辑: 回答一些问题: 为什么?在尝试执行之前,我需要知道一段代码何时忙碌。假设我们在 UI 上有两个按钮,A 和 B。A 执行方法 A,B 执行方法 B。他们都使用相同的对象来锁定/同步。当我看到有人已经在执行一段被同步对象实例 _syncObject 锁定的代码时,我想禁用这些按钮。我想给用户一个指示,该功能目前无法执行。
Monitor.TryEnter ,或尝试验证锁是否可用不是解决方案,因为它需要轮询而不是通知。
void methodA()
{
lock(_syncObject)
{
...
}
}
void methodB()
{
{
lock(_syncObject)
{
...
}
}
【问题讨论】:
-
你可能不会想要,即使你可以。如果你想这样做,你的设计很可能有问题。
-
你为什么要这样做?这肯定不是内置的。如果我们知道“为什么”,也许我们可以更好地回答。
-
您是否有理由不能在锁定块的开头设置“忙碌”标志并使用标准机制(例如
INotifyPropertyChanged)来更新您的 UI? -
@DanPuzey 两件事:除了methodA和methodB之外,还有更多使用_syncObject的方法。我将不得不在所有这些方法中设置/取消设置这个繁忙的标志。其次,我可能在这里简化了我的示例,但假设在 UI 和服务器代码之间存在 WCF 传输层,INotifyPropertyChanged 在这种情况下将不起作用。
-
如果您使用的是 WCF 传输层,您将如何触发任何事件以供客户端查看?也许这种“禁用”行为只是客户端,与锁完全无关。