문제

나는 일을 더 간단하게 만들려고 노력하고 있습니다. 내 코드는 다음과 같습니다.

    If Threading.Monitor.TryEnter(syncRoot) Then
        Try
            'do something
        Finally
            Threading.Monitor.Exit(syncRoot)
        End Try
    Else
        'do something else
    End If

이것은 소음 측면에서 ReaderWriterLock보다 더 나쁩니다. C# 또는 VB를 사용할 수 있으므로 중 하나에 신청하는 답변을 환영합니다.

도움이 되었습니까?

해결책

대의원을 사용 하시겠습니까?

예를 들어

public bool TryEnter(object lockObject, Action work) 
{
    if (Monitor.TryEnter(lockObject)) 
    {
       try 
       {
          work();
       }
       finally 
       {
           Monitor.Exit(lockObject);
       }        
       return true;
     }

     return false;
}

다른 팁

이것은 당신과 매우 유사합니다 마지막 게시물, 그리고 나는 비슷한 대답을 기대할 것입니다. 유일한 중요한 차이점은 타임 아웃이 실패하면 메소드에서 "널"을 반환 할 수 있다는 것입니다. 그러면 "dispose ()"이 호출되지 않으면 값을 쉽게 확인할 수 있습니다.

using(var token = GetLock(syncLock, timeout)) {
  if(token != null) { ... }
}

유일한 진짜 결함은 반드시 "개체"(또는 "t : class")에 확장 방법을 추가하고 싶지는 않다는 것입니다.

존 스키트 과거에 이것을 보았습니다. 볼만한 가치가 있습니다.

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