NetworkStream
에서 데이터를 임의로 보내고 데이터 패킷의 크기도 다양하게 유지해야합니다. 각 스레드가 읽을 수있는 자체 스트림이있는 다중 스레드 응용 프로그램을 구현 중입니다. 스트림에 데이터가 없으면 응용 프로그램은 데이터가 도착하기를 기다려야합니다. 그러나 서버가 데이터 전송을 완료하고 세션을 종료 한 경우 서버는 종료되어야합니다.NetworkStream.Read()와 NetworkStream.BeginRead()의 차이점은 무엇입니까?
처음에는 스트림에서 데이터를 얻기 위해 Read
메서드를 사용했지만 스레드를 차단하고 스트림에 데이터가 나타날 때까지 기다렸습니다. 원격 호스트가 연결 를 종료하고 사용 가능한 모든 데이터가 되었습니다받은 경우 MSDN의 문서에서 알 수
,
데이터가 읽을 수없는 경우
는 Read 메서드는 0을 반환 Read 메서드는 즉시 을 완료하고 0 바이트를 반환합니다.
제 경우에는 Read
메서드를 가져 와서 우아하게 종료하지 않았습니다. 그냥 무한정 기다립니다.
내가 더 조사 할 때, 데이터를 수신하자마자 스트림을 감시하고 콜백 메소드를 비동기 적으로 호출하는 BeginRead
을 보았습니다. 그러나이 방법을 사용하여 다양한 구현을 시도했지만, Read
과 대조적으로 BeginRead
을 사용할 때를 식별 할 수 없었습니다.
내가보기에, BeginRead
에는 현재 스레드를 차단하지 않는 비동기 호출이있는 장점이 있습니다. 그러나 내 응용 프로그램에서는 스트림에서 데이터를 읽고 처리하는 별도의 스레드가 이미 있으므로 그다지 큰 차이는 없습니다.
누구든지 나를
BeginRead
에 대한 대기 및 종료 메커니즘을 이해하는 데 도움 주실 래요과 어떻게Read
다릅니 까?원하는 기능을 구현하는 가장 좋은 방법은 무엇입니까?
리모컨이 제대로 연결을 종료하고 있습니까? 'Read'가 돌아 오지 않는 문제는 절대로 없었습니다. 그렇지 않으면 귀하의 접근 방식은 올바른 방향 인 것으로 보입니다. –
@Matthew 글쎄, 솔직히 말해서 나는 그것을 확실히 말할 수 없다. 우리가 읽고있는 제 3 자 서비스입니다. 그들은 셧다운 타이밍을 명기하고 우리는 그것이 언급 된대로 일어난다 고 가정한다. 나는 단지 그들에게 깃발을 올리기 전에 내 말을 먼저 확인하고 다시 점검하기를 원한다. –