锁定C#开关盒的首选方法

时间:2013-02-14 10:40:09

标签: c# asynchronous locking

internal static void ExecuteCommand(NLO nlo)
{
    switch (nlo.action)
    {
        //synchronize each method in case
        case (NLO.Actions.SET):
            swSet(nlo);
            break;
        case (NLO.Actions.ADD):
            swAdd(nlo);
            break;
        default:
            throw new System.Exception("Error");
            //break;
    }
    return;
}

我想要锁定,因此每个方法swSetswAdd都可以在并行运行,但锁定swSet与自身并行运行,swAdd相同}

最简单的方法是在每个案例周围放置锁定,或者在方法本身中锁定或在方法上使用[MethodImpl(MethodImplOptions.Synchronized)]

最后一个解决方案会锁定所有方法吗?

1 个答案:

答案 0 :(得分:4)

[MethodImpl(MethodImplOptions.Synchronized)]没有过多记录,但通常会对同一类型的所有此类方法使用相同的锁对象; from MSDN

  

只有一个线程可以在任何实例函数中执行,并且只有一个线程可以在任何类的静态函数中执行。

坦率地说,我从未发现该属性有用。在您的情况下,听起来您需要为这两种方法单独锁定:

private static readonly object setLock = new object(), addLock = new object();

static void swAdd(...) {
    lock(addLock) {...}
}
static void swSet(...) {
    lock(setLock) {...}
}