我正在尝试为我的网站宽松地实现自己的“锁定”或“互斥量”。为此,我正在使用isLocked属性来让服务器知道是否另一个用户正在运行该更新。我想初始化一次它的值,但是我不确定我的解决方案是否会这样做。这是完整的示例:

在模型中:

public abstract class BaseModel
{
    public static bool isLocked = false;
}


我在哪里使用该属性:

public class OtherModel : BaseModel
{
    public OtherModel() : base()
    {
        if (/*condition &&*/ !BaseModel.isLocked)
        {
            BaseModel.isLocked = true;
            //update
            BaseModel.isLocked = false;
        }
    }
}


服务器将初始化一次isLocked(第一次实例化BaseModel)还是我需要在Global.asx文件中设置其值?

编辑:@aa的This was shared,它更详细地说明了解决方案。

最佳答案

是的,服务器将一次初始化isLocked。但是,您有更大的问题。这里有比赛条件。

在检查isLocked是否为真与将isLocked设置为true的时间之间,另一个线程可能也在检查isLocked并发现它为false,并且两者都可能将其设置为true并认为两者都已锁定了静态对象。 。

这就是为什么您不应使用此类方法进行锁定的原因。而是使用静态对象,然后在该对象上使用c#lock语句,如下所示:

public class ViewModel
{
    public static object lockObject = new Object();
}

lock(Model.lockObject)
{
   // do something...
}


如果需要测试代码是否已锁定,请使用Monitor.TryEnter。

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

关于c# - 在何处初始化MVC模型中的静态属性并实现锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28160349/

10-11 13:50