1

2つの方法があるとしましょう-

getCurrentValue(int valueID)
updateValues(int changedComponentID)

これら 2 つのメソッドは、同じオブジェクトに対して別々のスレッドによって個別に呼び出されます。

getCurrentValue()現在の valueID のデータベース検索を行うだけです。

" Values" は、対応する変更の場合にcomponents変更されます。このupdateValues()メソッドは、変更されたばかりのコンポーネントに依存する値を更新しますchangedComponentID。これはデータベース操作であり、時間がかかります。

この更新操作が行われている間、データベースからルックアップを行って古い値を返したくありませんが、更新メソッドが完了するまで待ちたいと思います。同時に、2 つの更新操作が同時に発生したり、読み取り中に更新が発生したりしたくありません。

だから、私はこのようにそれを行うことを考えています -

[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;
     }

これが正しい方法であるかどうかはわかりません。助言がありますか?ありがとう。

4

3 に答える 3

2

これらの両方のメソッドの外部で静的オブジェクトを作成します。次に、そのオブジェクトに対してlockステートメントを使用します。一方のメソッドが保護されたコードにアクセスしているとき、もう一方のメソッドはロックが解除されるのを待ちます。

private static object _lockObj = new object();

public int getCurrentValue(int valueID)
     {
        object value;

        lock(_lockObj)
          {
           value = // read value from DB
          }
        return value;
     }

public void updateValues(int componentID)
     {
         lock(_lockObj)
          {
         // update values in DB

          }
     }
于 2012-12-17T18:51:12.370 に答える
2

それは正しい方法ではありません。このように、「アクティブ待機」を実行して、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
    }
}
于 2012-12-17T18:51:39.203 に答える
0
private static readonly object _lock = new object();

public int getCurrentValue(int valueID)
{
    try
    {
        Monitor.Enter(_lock);
        value = // read value from DB
        return value;
    }
    finally
    {
        Monitor.Exit(_lock);
    }
}

public void updateValues(int componentID)
{
    try
    {
        Monitor.Enter(_lock);
        // update values in DB
    }
    finally
    {
        Monitor.Exit(_lock);
    }
}
于 2012-12-17T18:57:04.660 に答える