在 MVC 模型中的何处初始化静态属性并实现锁
Where to Initialize Static Properties in an MVC Model & Implementing a Lock
我正在尝试为我的网站松散地实施我自己的 'lock' 或 'mutex'。为此,我使用了 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 文件中设置它的值?
编辑:@Michael This was shared 更详细地解释了解决方案。
是的,服务器会初始化一次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);
}
}
您没有在要锁定的代码周围使用 lock
语句的原因是什么?
例如
public class ViewModel
{
public static Object Lock = new Object();
}
public void Update()
{
lock (ViewModel.Lock)
{
//Perform updates
}
}
您可以查看与使用 lock
here 相关的好的答案,而不是我重复已经回答过的内容。
我正在尝试为我的网站松散地实施我自己的 'lock' 或 'mutex'。为此,我使用了 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 文件中设置它的值?
编辑:@Michael This was shared 更详细地解释了解决方案。
是的,服务器会初始化一次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);
}
}
您没有在要锁定的代码周围使用 lock
语句的原因是什么?
例如
public class ViewModel
{
public static Object Lock = new Object();
}
public void Update()
{
lock (ViewModel.Lock)
{
//Perform updates
}
}
您可以查看与使用 lock
here 相关的好的答案,而不是我重复已经回答过的内容。