gpt4 book ai didi

C#:你能检测出当前执行上下文是否在 `lock (this)` 内吗?

转载 作者:太空狗 更新时间:2023-10-30 00:17:19 24 4
gpt4 key购买 nike

如果我想强制从锁中访问一个对象,如下所示:

var obj = new MyObject();

lock (obj)
{
obj.Date = DateTime.Now;
obj.Name = "My Name";
}

是否有可能从 AddOneRemoveOne 函数中检测当前执行上下文是否在锁内?

类似于:

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);
}

这很简单,但是有两个问题:

  1. 我在mylock对象,有点滥用 IDisposable界面。

  2. 我想将 SetDateSetName 函数更改为属性,为清楚起见。

最佳答案

如果不自己跟踪状态(例如,通过使用某种信号量),我认为这是不可能的。但即使是,那也将严重违反封装。您的方法通常不应该关心它们是否在特定的锁定上下文中执行。

关于C#:你能检测出当前执行上下文是否在 `lock (this)` 内吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2582005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com