2012-07-04 82 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

我已經改變了一下代碼,嘗試更新的一個 –