C# Monitor.TryEnter检查对象是否已锁定?

C# Monitor.TryEnter检查对象是否已锁定?,c#,multithreading,C#,Multithreading,我有许多调用公共函数的工作线程。我使用锁对象,如下所示: static object var mylock = new object(); public void myFunction() { if (Monitor.TryEnter(mylock, 0)) { try { // Do work } finally { Monitor.Exit(mylo

我有许多调用公共函数的工作线程。我使用锁对象,如下所示:

static object var mylock = new object();

public void myFunction()
{
    if (Monitor.TryEnter(mylock, 0))
    {
        try
        {
           // Do work
        }
        finally
        {
            Monitor.Exit(mylock);
        }
    }
}
但是,在进入myFunction之前,我想知道对象是否已锁定,以便我可以执行其他操作。所以我做了:

    public bool IsLocked
    {
        get { return !Monitor.TryEnter(locker); }
    }

这会起作用,还是锁定对象?

如果对象未锁定,它将锁定对象,并且在您调用exit之前不会释放锁定。如果锁已经被另一个线程占用,它将不会获取锁,但是如果您正在对首先获取锁的线程进行调用,则
TryEnter
将成功

要解决此问题,可以使用标志和联锁功能:

object var mylock = new object();
long isLocked;

public void myFunction()
{
    if (Monitor.TryEnter(mylock, 0))
    {
        Interlocked.Exchange(ref isLocked, 1);
        try
        {
           // Do work
        }
        finally
        {
            Interlocked.Exchange(ref isLocked, 0);
            Monitor.Exit(mylock);
        }
    }
}

public bool IsLocked
{
    get { return Interlocked.Read(ref isLocked)==0; }
}

如果成功,它将锁定对象。在尝试锁定之前检查对象是否已锁定没有意义,因为它可能在检查和锁定之间被锁定。因此。。。有没有办法只检查对象是否被锁定?没有什么意义,因为这些信息并不是真正有用的。如果它没有被锁定,而你继续打电话给TryEnter,认为它会成功,那么你可能是错的,因为比赛条件。是的,如果它成功,那就需要锁定。另外:即使它被锁定,拥有锁的线程也会由于重入而报告成功。但是ta.speot的观点是正确的,更严肃的。这就是全部观点。如果有类似Monitor.IsLocked(object)的东西,那么完全有可能在您调用该代码检查是否有锁被获取,以及下一个代码语句之间,另一个线程可能会出现并在该对象上获取锁,从而使您的初始检查无效。