简体   繁体   English

C#线程同步

[英]c# thread synchronization

I am developing an app for wp7. 我正在为wp7开发一个应用程序。 I required a synchronized read and write. 我需要同步读写。 So I created this class 所以我创建了这个班

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

Now my threadwrite enqueues packets in the queue and threadread reads from the queue.Both are infinite running threads. 现在我的threadwrite将数据包排入队列,并从队列中读取线程读取。两个都是无限运行的线程。 But i don't know some how threadwrite is blocked at packetQ.removeat(0). 但是我不知道如何在packetQ.removeat(0)处阻止线程写入。

I think you should create lock object and use it your lock 我认为您应该创建锁对象并使用它作为锁

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM