gpt4 book ai didi

c# - 如果其他方法正在运行,如何确保某个方法不会被执行?

转载 作者:太空宇宙 更新时间:2023-11-03 21:52:13 25 4
gpt4 key购买 nike

假设我有两种方法 -

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com