Skip to main content
 首页 » 编程设计

c#之如何在不弄乱缩进的情况下在 VS2012 中获取多个锁

2024年08月12日43dyllove98

这看起来是个愚蠢的问题,但我找不到解决方案。

我的问题是 C# 不允许在单个 lock 语句中获取多个锁。这行不通:

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

相反,它似乎需要大量的缩进才能做到这一点:

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

再加上代码已经存在的所有其他缩进级别(命名空间、类、方法、条件、循环……),这变得很疯狂。因此,我想使用这种格式:

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

并保持我的理智。但是 Visual Studio(我使用的是 2012)不会听说它。一旦我输入任何右大括号,上面的内容就会变成一些愚蠢的东西,比如:

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

而且我似乎无能为力。有什么方法可以使它起作用吗?

请您参考如下方法:

只是一个想法:-)

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