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

标签 c# .net synchronization multithreading locking

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

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/

相关文章:

c# - 如何在 C#/.NET 中使用 LINQ 表达式树调用 lambda

c# - Linq 和返回类型

c# - 为什么类 Program 的默认构造函数 Never executed?

.net - 如何在 .NET 中检测当前进程/线程饥饿

android - 如何处理本地缓存的间隙

java - 将 Java 虚拟机与 System.nanoTime 同步

multithreading - java : how volatile guarantee visibility of "data" in this piece of code?

c# - 使用 c# 和 xaml 在 Metro App 中显示 svg

c# - 如何以多种方式访问​​一个变量

c# - WaveChannel32 给了我一个异常 : Offset and length were out of bounds