2012-07-04 3 views
0

wp7 용 앱을 개발 중입니다. 동기화 된 읽기 및 쓰기가 필요했습니다. 그래서 나는 큐 지금 내 threadwrite의 대기열에 패킷을이 클래스 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); 
     } 
    } 
} 

를 생성하고 queue.Both 무한 실행중인 스레드가에서 threadread는 읽습니다. 하지만 threadwrite가 packetQ.removeat (0)에서 어떻게 차단되는지 알지 못합니다.

+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

코드를 약간 변경했습니다. 업데이트 된 코드를 사용해보십시오. –