문제

개체를 잠그려고 시도해야 하며 이미 잠겨 있으면 계속 진행합니다(시간 초과 후 또는 개체 없이).

C# 잠금 문이 차단 중입니다.

도움이 되었습니까?

해결책

나는 당신이 사용할 수 있다고 믿습니다 Monitor.TryEnter().

lock 문은 다음과 같이 변환됩니다. Monitor.Enter() 전화하고 try catch 차단하다.

다른 팁

Ed는 귀하에게 딱 맞는 기능을 가지고 있습니다.전화하는 것을 잊지 마세요 Monitor.Exit().당신은 try-finally 적절한 정리를 보장하기 위해 차단합니다.

if (Monitor.TryEnter(someObject))
{
    try
    {
        // use object
    }
    finally
    {
        Monitor.Exit(someObject);
    }
}

나는 같은 문제가 있었고 결국 수업을 만들었습니다. TryLock IDisposable을 구현한 다음 using 잠금 범위를 제어하는 ​​명령문:

public class TryLock : IDisposable
{
    private object locked;

    public bool HasLock { get; private set; }

    public TryLock(object obj)
    {
        if (Monitor.TryEnter(obj))
        {
            HasLock = true;
            locked = obj;
        }
    }

    public void Dispose()
    {
        if (HasLock)
        {
            Monitor.Exit(locked);
            locked = null;
            HasLock = false;
        }
    }
}

그런 다음 다음 구문을 사용하여 잠급니다.

var obj = new object();

using (var tryLock = new TryLock(obj))
{
    if (tryLock.HasLock)
    {
        Console.WriteLine("Lock acquired..");
    }
}

다른 사람들이 당신에게 올바른 방향을 알려 주었으므로 이제 스스로 이 사실을 알게 될 것입니다. 그러나 TryEnter는 시간 제한 매개 변수를 사용할 수도 있습니다.

Jeff Richter의 "CLR Via C#"은 더 복잡한 내용을 다루고 있는 경우 CLR 내부에 대한 세부 정보를 제공하는 훌륭한 책입니다.

시간 초과 입력과 함께 AutoResetEvent 및 해당 메소드 WaitOne을 사용하는 것을 고려하십시오.

static AutoResetEvent autoEvent = new AutoResetEvent(true);
if(autoEvent.WaitOne(0))
{
    //start critical section
    Console.WriteLine("no other thread here, do your job");
    Thread.Sleep(5000);
    //end critical section
    autoEvent.Set();
}
else
{
    Console.WriteLine("A thread working already at this time.");
}

보다 https://msdn.microsoft.com/en-us/library/cc189907(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/system.threading.autoresetevent(v=vs.110).aspx 그리고 https://msdn.microsoft.com/en-us/library/cc190477(v=vs.110).aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top