2009-09-01 4 views
5

세 가지 다른 일을 담당하는 응용 프로그램에 작업자 스레드가 있습니다. 내가 작성한 대기열에서 두 개의 작업에 대한 요청이 나타나고 요청이 네트워크 스트림에서 나타나면 다른 작업이 활성화됩니다. 수행 할 작업이 없을 때 작업자 스레드가 대기하도록합니다. 두 개의 큐가 Item을 가질 때 설정되는 ManualResetEvent를 노출 할 때이 작업은 쉽지만 NetworkStream에는이 항목이없는 것 같습니다. NetworkStream은 TcpClient에서 검색되었습니다.네트워크 스트림에서 데이터를 읽을 때까지 어떻게 기다려야합니까?

내가 후 나는 것은 다음과 같이 보입니다 코드는 다음과 같습니다

while (notDone) 
{ 
    WaitHandle.WaitAny(new WaitHandle[] { queue1.HasData, queue2.HasData, netStream.HasData }); 
    // ... 
    if (netStream.DataAvailable) 
    { 
     netStream.Read(buffer, 0, 20); 
     // process buffer 
    } 
} 

는 사람이는 NetworkStream 데이터가있을 때 설정되는 WaitHandle이 얻을 수있는 방법을 알고 있나요?

답변

7

NetworkStream의 비동기 메서드를 사용하고 EndReceive 메서드에서 ManualResetEvent를 설정할 수 있습니다. 콜백 메서드

netStream.EndRead(ar); 
netStreamManualResetEvent.Set(); 

내부

// ... 
netStream.BeginRead(buffer, offset, callback, state); 
// ... 

는 코드

while (notDone) 
{ 
    WaitHandle.WaitAny(new WaitHandle[] { queue1.HasData, queue2.HasData, netStreamManualResetEvent}); 
    // ... 
    if (netStream.DataAvailable) 
    { 
     // make the buffer from the AsyncState in the callback method available here 
     // process buffer 
    } 
} 
+0

그것은 0 바이트를 읽도록하는 BeginRead를 얻을 수 있습니까? –

+0

원격 호스트가 연결을 종료하고 더 이상 사용할 수있는 데이터가없는 경우 0 바이트가 읽혀집니다. 왜 묻는거야? – SpaceghostAli

+0

BeginRead를 0 바이트로 읽을 수 없으면 기본 루프와 콜백 사이의 읽기 버퍼를 관리해야합니다. 이것은 완전히 할 수 있지만 내가 좋아하는만큼 좋지 않습니다. –

2

가장 간단한 방법은 아마도 동 기적으로 읽고 여분의 데이터를 추가 대기열에 넣는 추가 스레드를 사용하는 것입니다.

또는 비동기 IO를 사용할 수도 있지만 다소 까다 롭습니다. 추가 큐가 필요합니다.

SocketSelect() 방법을 사용하고 있습니다 (그리고 NetworkStream에서 소켓을 얻을 수 있습니다).이 기능을 다른 종류의 대기 핸들과 함께 사용할 수있는 방식으로이 기능을 제공한다고는 생각하지 않습니다.