2012-07-04 81 views
0

我正在为wp7开发一个应用程序。我需要一个同步读取和写入。 所以我在队列创建此类c#线程同步

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读取来自queue.Both是无限运行的线程。 但我不知道一些如何在packetQ.removeat(0)处阻塞threadwrite。

+0

发生这种情况,因为你是在packetsQ应用锁。您应该对某个其他对象应用锁以将其删除。 – shalki

回答

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

谢谢。其实我是照你说的。但我不明白为什么这个工作。为什么不实施? – rakesh

+0

它仍然没有工作 – rakesh

+0

我已经改变了一下代码,尝试更新的一个 –