假设我有两种方法 -
getCurrentValue(int valueID)
updateValues(int changedComponentID)
这两个方法由不同的线程独立地在同一个对象上调用。
getCurrentValue()
只是在数据库中查找当前的 valueID。
"Values
"如果相应的components
发生变化则发生变化。 updateValues()
方法更新那些依赖于刚刚更改的组件的值,即 changedComponentID
。这是一个数据库操作,需要时间。
在进行此更新操作时,我不想通过从数据库中查找来返回过时值,但我想等到更新方法完成。同时,我不希望同时发生两个更新操作或在进行读取时发生更新。
所以,我正在考虑这样做 -
[MethodImpl(MethodImplOptions.Synchronized)]
public int getCurrentValue(int valueID)
{
while(updateOperationIsGoingOn)
{
// do nothing
}
readOperationIsGoingOn = true;
value = // read value from DB
readOperationIsGoingOn = false;
return value;
}
[MethodImpl(MethodImplOptions.Synchronized)]
public void updateValues(int componentID)
{
while(readOperationIsGoingOn)
{
// do nothing
}
updateOperationIsGoingOn = true;
// update values in DB
updateOperationIsGoingOn = false;
}
我不确定这是否是正确的做法。有什么建议么?谢谢。
最佳答案
这不是正确的方法。像这样,您正在进行“主动等待”,有效地阻塞了您的 CPU。
您应该改用锁:
static object _syncRoot = new object();
public int getCurrentValue(int valueID)
{
lock(_syncRoot)
{
value = // read value from DB
}
}
public void updateValues(int componentID)
{
lock(_syncRoot)
{
// update values in DB
}
}
关于c# - 如果其他方法正在运行,如何确保某个方法不会被执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13920181/