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

时间:2014-02-15 13:11:32

标签: c# multithreading

我有许多调用常用函数的工作线程。我按如下方式使用锁定对象:

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

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

1 个答案:

答案 0 :(得分:0)

如果对象未锁定,它将锁定对象,并且在您调用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; }
}