Skip to main content
 首页 » 编程设计

c#之在 MVC 模型中的何处初始化静态属性并实现锁

2024年08月06日46myhome

我正在尝试为我的网站松散地实现我自己的“锁”或“互斥锁”。为此,我使用 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文件中设置它的值?

编辑:This was shared @Michael 更详细地解释了解决方案。

请您参考如下方法:

是的,服务器会初始化一次isLocked。但是,你有一个更大的问题。这里存在竞争条件。

有可能在您检查 isLocked 是否为 true 和将 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); 
    } 
}