2012-09-19 8 views
1

특정 문제가 있습니다, 버퍼가 비어 있지 않은 경우 일부 기간 컨트롤에서 별도의 작업 스레드가 싶습니다. 그렇지 않다면, 쓰레드는 버퍼 (ConcurrentQueue)로부터 데이터를 전송합니다 ... CPU에 많은 비용이 들지 않는 좋은 해결책이 있습니까 ??스레드 루핑 및 버퍼에서 메시지를 기다리는 중 - 최상의 솔루션

내 방법은 작동하지만 어쩌면 좋지 않을 수도 있습니다. (실제로는 스레드 간 동기화가 많지 않습니다.)

public void start(object timeout){ 

      //Message - my own objective implementation of some tcp message 
      Message m; 
      while (true) { 
       if (msgBuffer.Count != 0) { 
        if (msgBuffer.TryDequeue(out m)) { 
         client.SendData(MediatorPacket.GetPacketBytes(m)); 
         SpinWait.SpinUntil(() => { if (msgBuffer.Count != 0) return true; else return false; }); 
        } 
       } 
      } 
     }*/ 

답변

0

생산자 - 소비자가 차단 동작을하는 것처럼 들리 네요. 즉, 소비자는 차단하고 버퍼에 데이터가있을 때까지 예약되지 않습니다. 이 경우에는 BlockingCollection을보십시오.

1

물론입니다. TPL DataFlow 라이브러리를 살펴보십시오. 특히 BufferBlock은 사용자의 필요에 따라 적합해야합니다. 당신은 또한 this primer 흥미로운 읽을 수 있습니다.