有没有办法检测一个对象是否被locking?

有没有什么办法来确定一个对象是否被locking在C#中? 我有一个难以置信的位置,通过devise,我正在从一个class级里面的队列里读书,而且我需要将这些内容转储到class级中的一个集合中。 但是该集合也可以从类外的接口读取/写入。 所以显然可能会有这样一个情况,即收集正在写入,同时我想写信给它。

我可以编程,使用委托,但它会是丑陋的。

您可以始终使用值为0的值来在Monitor类上调用静态TryEnter方法以等待值。 如果被locking,则该呼叫将返回错误。

但是,这里的问题是,您需要确保您尝试同步访问的列表被locking在其自身上,以同步访问。

使用访问被同步的对象作为locking对象(暴露对象的内部细节太多)通常是不好的做法。

请记住,锁可以在其他任何东西上,所以只要在列表上调用它就是毫无意义的,除非你确定这个列表是被locking的。

如果对象没有被locking, Monitor.TryEnter会成功,如果此时对象被locking,将返回false。 但是请注意,这里有一个隐式竞争:这个方法返回的实例,对象可能不会再被locking。

我不确定如果一个时间为0的TryEnter静态调用将保证locking将不被获取,如果它是可用的。 我在debugging模式下testing了同步variables被locking的解决scheme是使用以下方法:

 #if DEBUG // Make sure we're inside a lock of the SyncRoot by trying to lock it. // If we're able to lock it, that means that it wasn't locked in the first // place. Afterwards, we release the lock if we had obtained it. bool acquired = false; try { acquired = Monitor.TryEnter(SyncRoot); } finally { if (acquired) { Monitor.Exit(SyncRoot); } } Debug.Assert(acquired == false, "The SyncRoot is not locked."); #endif 

目前您可以调用Monitor.TryEnter来检查对象是否被locking。

在.NET 4.0中,CLR团队将添加“locking检查API”

这里是从里克·拜尔斯的文章引用:

锁检查
我们正在向ICorDebug添加一些简单的API,这些API允许您探索托pipe锁(监视器)。 例如,如果某个线程被阻塞等待locking,则可以find其他线程当前正在locking的locking(以及是否有超时)。

所以,通过这个API,你将能够检查:
1)什么东西拿着锁?
2)谁在等着呢?

希望这可以帮助。

Monitor.IsEntered

确定当前线程是否持有指定对象的locking。
自4.5起可用