我正在尝试为我的网站宽松地实现自己的“锁定”或“互斥量”。为此,我正在使用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/