0

私はwp7用のアプリを開発しています。同期された読み取りと書き込みが必要でした。だから私はこのクラスを作成しました

public class SynchronizedPacketQueue
{
    [DataMember]
    public List<Packet> packetsQ;

    public SynchronizedPacketQueue()
    {
        packetsQ = new List<Packet>();
    }

    public int Count
    {
        get { return packetsQ.Count; }
        private set{}
    }


    public Packet Dequeue()
    {
        lock (packetsQ)
        {
            if (packetsQ.Count == 0)
            {
                Monitor.Wait(packetsQ);

            }
            Packet packet = packetsQ[0];
            packetsQ.RemoveAt(0);
            return packet;
        }
    }

    public void  Enqueue(Packet packet)
    {
        lock (packetsQ)
        {
            packetsQ.Add(packet);
            Monitor.Pulse(packetsQ);
        }
    }
}

これで、threadwriteはパケットをキューにエンキューし、threadreadはキューから読み取ります。どちらも無限に実行されるスレッドです。しかし、packetQ.removeat(0)でスレッド書き込みがどのようにブロックされるのかわかりません。

4

1 に答える 1

1

ロックオブジェクトを作成して、それを自分のロックとして使用する必要があると思います

public class SynchronizedPacketQueue
   {
      [DataMember]
      public List<Packet> packetsQ;
      private object mylock = new object();

      public SynchronizedPacketQueue()
      {
        packetsQ = new List<Packet>();
      }

    public int Count
    {
        get { return packetsQ.Count; }
        private set{}
    }


    public Packet Dequeue()
    {
        lock (mylock)
        {
            if (packetsQ.Count == 0)
            {
                Monitor.Wait(mylock);

            }
            Packet packet = packetsQ[0];
            packetsQ.RemoveAt(0);
            return packet;
        }
    }

    public void  Enqueue(Packet packet)
    {
        lock (mylock)
        {
            packetsQ.Add(packet);
            Monitor.Pulse(mylock);
        }
    }
}
于 2012-07-04T07:05:30.697 に答える