2008-09-22 11 views
2

많은 짧은 메시지가있는 처리량이 많은 상황에서 .NET의 Stream.BeginWrite 비동기 I/O API를 사용하려고합니다. 따라서, scatter/gather API는 컨텍스트 스위치 (및 CPU 사용)의 수를 엄청나게 줄일 것입니다. 이 API는 LPBUFFERS Win32 API를 전혀 사용합니까? 분산 형/수집 형 I/O를위한 대체 API가 있습니까?.NET에서 분산/비동기 소켓 I/O 수집

답변

-2

.NET에서 소켓 분산/수집 I/O를 수행 할 방법이 없습니다. MSFT 블로그 게시물에 따르면 .NET 4.5에 유사한 API가있을 수 있습니다 (그게 무엇이든간에 ...)

+0

블로그 게시물에 대한 링크가 있습니까? –

1

BCL에서 분산/수집 API에 도달 할 수 있다면 놀라실 것입니다.하지만, 항상 P/Invoke가 있습니다 (사용하기가 쉽고, 찾았습니다). 당신이 할 수있는,

2) MS는 최근 디버깅을 위해 소스를 개방

1) 리플렉터 : 당신이 프레임 워크의 내장으로 파고하려면

2

.net 소스를 보면 승인 된 대답이 잘못되었습니다.

SocketAsyncEventArgs에는 BufferList 속성이 있습니다. 그 사용하는 경우 Socket.SendAsync(SocketAsyncEventArgs) 내부적 WSASend를 사용하기 때문에, 대신에 전용 메모리의 하나의 연속 블록을 저장할 수있는 Buffer 속성, 작업

다중 송신 버퍼 할 수 있는지, DMA를 수집/분산을 사용할 수있다 산란에 그것을 적용하고 지정된/

이 허용하는,

Socket.SendAsync(SocketAsyncEventArgs)WSARecv를 사용하여 I/O의 유형을 수집 다수의 수신 버퍼 산란에 그것을 적용하게 지정할 수/

내가 3.5 소스 편리한 그물이없는 I/O의 유형을 수집하지만, BufferList는 .NET 3.5부터 존재하므로 분산은/지원되었을 수 있습니다 모여 이후 .net 3.5. WSASend 및 WSARecv에 대한 최소 OS 요구 사항은 Windows Vista/Server 2003으로 설명되어 있습니다.

N.B. 어떤 스트림을 사용하고 있는지 알 수는 없지만 NetworkStream.BeginWrite은 WSASend에 단일 버퍼를 전송하므로 분산/수집에는 사용할 수 없습니다.