2016-11-16 8 views
0

최대 30,000 개의 원격 장치를 관리하는 서비스를 개발 중입니다.쓰기 대신 BeginWrite를 사용해야하는 이유는 무엇입니까?

비동기 메소드 인 것 같습니다. BeginWrite는 다음 자원을 더 많이 사용합니다. Write (콜백 스레드를 작성하는 데 필요한 오버 헤드로 인해); 반면에 Write 메서드는 항상 BeginWrite보다 빨리 반환됩니다.

제 질문은 BeginWrite를 선호하는 이유는 무엇입니까?

또 다른 질문은 : Write WriteTimeout for sync Write를 설정해야하는 이유는 무엇입니까? 어떤 경우 Write 메서드는 (예를 들어 닫힌 소켓 때문에) 즉각적인 예외를 생성하지는 않지만 합리적인 시간 내에 완료하지 못합니까?

EDIT : 나는 작업자 스레드 (32 또는 64)를 가지고 있으므로 한 번에 500-1000 개의 장치에 데이터를 보내고 쓰기는 BeginWrite보다 잘 작동하는 것 같습니다.

EDIT 2 : 약간의 검색 후, 필자는 쓰기 버퍼가 가득차면 sync write가 중단된다는 것을 알고 있습니다. 기본 쓰기 버퍼 크기는 8KB이며 한 번에 1-2KB의 데이터 만 전송하므로 내 응용 프로그램에서 Write가 중단되지 않아야하고 BeginWrite가 더 잘 수행됩니다. WriteTimeout 보안을 1 초로 설정했습니다.

+0

데이터를 모든 원격 장치에 한 번에 보냅니 까? 테스트 코드를 보여줄 수 있습니까? –

+0

한 번에 500-1000 개의 기기에 데이터를 전송합니다. – ElmoDev001

+0

매우 큰 프로젝트이므로 코드를 보여주는 것이 간단하지 않습니다. – ElmoDev001

답변

2

확장 성.

동기 호출은 스레드가 완료되는 동안 스레드를 차단합니다. 비동기 메소드는 그렇지 않습니다. 얼마나 많은 동시 요청을 처리 할 것인지에 따라 문제가 될 수 있습니다.

+0

이것이 비동기 쓰기를 시도한 이유입니다.하지만 테스트에서 본 것은 쓰기가 동시 쓰기 작업 (500-1000) (동시 쓰기가 아닌 다른 소켓에 있음)을 사용해도 더 잘 작동한다는 것입니다. – ElmoDev001

+0

음, 항상 측정하기 때문에 YMMV. 아직도, 1000은 지금 당신의 최대 수 있지만 미래에 ... 그리고 당신이 보존하려고하는 특정 채널 (이 경우 소켓) 아니에요 - 스레드. 그것들은 한정된 자원입니다. – n8wrl