1

私は現在、辞書で値が変更されるまでブロックするメソッドを設計しようとしています。ここでは、WaitForOpenSpotメソッドを使用しています。これは大まかなスケッチにすぎません。現在、スレッドセーフではないことを認識しています。最終的には、ロック/ロック解除を後で追加します。今のところ、これを行うためのより良い方法があるかどうか知りたいですか?他の提案もいただければ幸いです。

Class AccountStatus
{
  static bool OpenSpot = false;

  static private Dictionary<String, int> Transfer = InitializeContainer();

  static Dictionary<String , int> InitializeContainer ()
  {
       Dictionary<String, int> Transfer = new Dictionary<String, int>()
       Transfer.add("stat",0);
  }

  static void  Changestatus(string str , int val) //str = stat 
  {
      Transfer[str] = val;
      if(val == 1)
      {
          OpenSpot = true
      }        
  } 

  static void WaitForOpenSpot()
  {
      while(!OpenSpot)
      {
          Thread.sleep(2);
      }
  } 
}//end class
4

2 に答える 2

3

AutoResetEventクラスを見てください。

大まかな例を示すためにコードから採用する(コンパイルされない場合があります):

private static AutoResetEvent resetEvent = new AutoResetEvent(false); 

static void WaitForOpenSpot()
{  
    resetEvent.WaitOne();
}

static void ChangeStatus(string str, int val)
{
   Transfer[str] = val;
   if (val == 1)
   {
       resetEvent.Set();
   }
}
于 2013-02-12T18:23:54.313 に答える
0

このようなものの通常のパターンは、Monitor.Wait/を使用することMonitor.PulseAllです。これらのメソッドを使用するには、ロック内でのみ変更できる待機条件を定義し、その条件を変更する可能性のあるコードで、変更PulseAll後にロックを実行する必要があります。

例:辞書myDict;

//Code that waits for magic key value:
lock(myDict)
{
    int myNumber;
    while (!myDict.TryGetValue(myKey, out myNumber) || myNumber < valueOfInterest)
        Monitor.Wait(myDict);
}

//Code that changes anything in myDict:
lock(myDict)
{
    myDict[theKey] = theValue;
    Monitor.PulseAll(myDict);
}

ディクショナリで何かが変更されるたびに、特定のキーが特定の値を保持するのを待機しているすべての待機中のスレッドは、それが変更されるかどうかを1つずつ確認し、続行するか、待機に戻ります。

このコードの正確性は、Monitor.Waitパルス化されずに早期に自発的に戻ることがある場合は影響を受けないことに注意してください。一般に自発的にウェイクアップすることはありませんが、正しく記述されたコードは一般にそのMonitor.Waitようなウェイクアップに耐えることができ、そのようなウェイクアップによって破損するコードは一般に他の方法でも破損します。

于 2013-02-12T19:13:35.267 に答える