如果我想强制从锁中访问一个对象,如下所示:
var obj = new MyObject();
lock (obj)
{
obj.Date = DateTime.Now;
obj.Name = "My Name";
}
是否有可能从 AddOne
和 RemoveOne
函数中检测当前执行上下文是否在锁内?
类似于:
Monitor.AreWeCurrentlyEnteredInto(this)
编辑:(用于澄清意图)
这里的目的是能够拒绝在锁之外进行的任何修改,以便对对象本身的所有更改都是事务性和线程安全的。锁定对象本身内的互斥量并不能确保编辑的事务性质。
我知道可以这样做:
var obj = new MyObject();
obj.MonitorEnterThis();
try
{
obj.Date = DateTime.Now;
obj.Name = "My Name";
}
finally
{
obj.MonitorExitThis();
}
但这将允许任何其他线程调用添加/删除函数而无需先调用Enter
,从而绕过保护。
编辑 2:
这是我目前正在做的事情:
var obj = new MyObject();
using (var mylock = obj.Lock())
{
obj.SetDate(DateTime.Now, mylock);
obj.SetName("New Name", mylock);
}
这很简单,但是有两个问题:
我在 mylock对象,有点 滥用 IDisposable 界面。
我想将
SetDate
和SetName
函数更改为 属性,为清楚起见。
最佳答案
如果不自己跟踪状态(例如,通过使用某种信号量),我认为这是不可能的。但即使是,那也将严重违反封装。您的方法通常不应该关心它们是否在特定的锁定上下文中执行。
关于C#:你能检测出当前执行上下文是否在 `lock (this)` 内吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2582005/