2008-09-22 8 views
2

Ich versuche, die Stream.BeginWrite Async-E/A-API in .NET für eine Situation mit hohem Durchsatz mit vielen kurzen Nachrichten zu verwenden. Daher reduziert eine Scatter/Gather-API die Anzahl der Kontextwechsel (und CPU-Auslastung) enorm. Verwendet diese API die LPBUFFERS Win32-API überhaupt? Gibt es eine alternative API für Scatter/Gather I/O?Scatter/assay Async-Socket-E/A in .NET

Antwort

-2

Es gibt keine Möglichkeit, Socket Scatter/Gather I/O in .NET zu tun. Laut eines MSFT-Blogposts gibt es möglicherweise eine ähnliche API in .NET 4.5 (was auch immer das ist ...)

+0

Haben Sie einen Link zu diesem Blogeintrag? –

1

Ich wäre überrascht, wenn Sie zu den Scatter/Gather APIs von der BCL (es ist für die L33t w1n32 Haxx0rz, weißt du?), Aber es gibt immer P/Invoke (was überraschend einfach zu bedienen ist, ich ' gefunden haben).

2

Mit Blick auf die .net-Quellen scheint die akzeptierte Antwort falsch zu sein.

SocketAsyncEventArgs hat ein BufferList Attribut. Wenn dieser verwendet wird, anstelle des Buffer Attribut, das einen einzigen zusammenhängenden Speicherblock nur halten kann, können Operationen Verwendung von Streu machen/DMA sammeln, wie Socket.SendAsync(SocketAsyncEventArgs)WSASend intern verwendet, dass

mehreren Sendepuffern ermöglicht, dass es anwendbar auf die Streuung angegeben Herstellung/Gather Art von I/O

und Socket.SendAsync(SocketAsyncEventArgs)WSARecv verwendet, dass

mehrere Empfangspuffer ermöglicht spezifiziert werden so dass es für den Scatter/Gather Art von I/O

Ich habe nicht die .net 3.5 Quellen praktisch, aber BufferList existiert seit .net 3.5, so Scatter/Gather könnten unterstützt wurden seit .net 3.5. Die minimalen Betriebssystemanforderungen für WSASend und WSARecv sind als Windows Vista/Server 2003 dokumentiert.

N.B. Ich weiß nicht, welchen Stream Sie verwenden, aber NetworkStream.BeginWrite sendet einen einzelnen Puffer an das WSASend, so dass Sie das nicht zum Streamen/Sammeln verwenden können.