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

标签 c# thread-safety

假设我有两种方法 -

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/

相关文章:

c# - 具有批量生产者的生产者/消费者模式

java - 安卓 : is it safe to create a View and a Handler in a worker thread

c# - 使 slider 使用现有的 IValueConverter

c# - ASP.Net MVC 3 和 System.Data.Entity?

C#:GridView、逐行操作

c#读取属性值

objective-c - 我可以在 -dealloc 中调用 [self retain] 吗?或者,如何确保 dealloc 发生在主线程上?

c# - WHERE IN 子句

C++11 在同一线程中执行 block 但超时

.net - 多线程写入,从队列中读取一个线程,线程安全