2014-11-12 5 views
1

이것은 바보 같은 질문이지만이 문제에 대한 해결책을 찾을 수 없습니다.들여 쓰기를하지 않고 VS2012에서 여러 개의 잠금을 얻는 방법

내 문제는 C#이 단일 lock 문에서 다중 잠금을 획득 할 수 없다는 것입니다. 이것은 작동하지 않습니다 : 코드는 이미 다른 들여 쓰기 수준과 결합

lock (a) 
    lock (b) 
     lock (c) 
      lock (d) 
      { 
       // ... 
      } 

(:

lock (a, b, c, d) 
{ 
    // ... 
} 

대신,이 작업을 수행하기 위해 들여 쓰기의 미친 금액을 요구하는 것 이름 공간, 클래스, 메소드, 조건부, 루프 ...), 이것은 미쳐 버린다. 대신이 형식을 사용하고 싶습니다.

lock (a) lock (b) lock (c) lock (d) 
{ 
    // ... 
} 

그리고 내 성실함을 보존하십시오. 그러나 Visual Studio (저는 2012를 사용하고 있습니다)는 그것을 듣지 못합니다. 닫는 중괄호를 입력하자마자 위의 내용은 다음과 같이 바보 같이 변합니다.

lock (a) lock (b) lock (c) lock (d) 
        { 
         // ... 
        } 

내가 할 수있는 일은없는 것처럼 보입니다. 이 일을 할 수있는 방법이 있습니까?

+0

Resharper 또는 이와 유사한 소프트웨어가 설치되어 있습니까? –

+0

@DaveZych 아니요, 제 3 자 모듈을 사용하지 않습니다. –

+2

이 작업을 자주하지 않기를 바랍니다. 여러 개의 잠금을 획득하면 아마도 자신을 교착 상태로 만드는 가장 쉬운 방법 일 수 있습니다. –

답변

1

한 번에 많은 잠금을 사용하면 교착 상태가 발생하는 것입니다. 지옥, 한 번에 두 가지 다른 자물쇠를 획득하는 것조차 위험을 감수합니다.

최소한, 매우이어야합니다. 한 번에 둘 이상을 획득하는 모든 곳에서 정확히 동일한 순서로 이러한 잠금을 수행해야합니다.

또한 "멋진 서식 지정"은 보는 사람의 눈에 있습니다. 즉, 모든 사람은 자신의 아이디어가 무엇인지에 대해 잘 알고 있습니다.

lock (a) 
lock (b) 
lock (c) 
lock (d) 
{ 
} 

당신은 또한 using 문에이 방법을 사용할 수 있습니다 그러나, 다음 (자동 포맷 규칙 또는 명시 적으로 자동 서식을 유발하여 예) 특별히에게 부탁하지 않는 한 덤비는 VS없이 작동합니다 (VS IDE가 이미 예상하고있는 것보다 더 많은 행을 가지고있는 것이 훨씬 더 일반적입니다).

+0

거의 작동 하나 완전히는 아닙니다. 마지막 잠금이 자동으로 들여 쓰기됩니다. –

2

그냥 아이디어 : -)

static class LockAndExecute 
{ 
    [MethodImpl(MethodImplOptions.AggressiveInlining)] 
    static void _gen(Action a, object[] objs, int i = 0){ 

     bool lockWasTaken = false; 
     var temp = objs[i]; 
     try { 
      Monitor.Enter(temp, ref lockWasTaken); 
      if(i + 1 >= objs.Length) 
       a(); 
      else 
       _gen(a, objs, i + 1); 
     } 
     finally 
     { 
      if (lockWasTaken) 
       Monitor.Exit(temp); 
     } 
    } 

    public static void Do(object[] objectsToLock, Action action){ 
      _gen(action, objectsToLock); 
    } 
} 

및 사용;

LockAndExecute.Do(new[]{a, b},() => { 
    Console.WriteLine("Eww!"); 
});