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
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 ...)
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).
Wenn Sie in den Eingeweiden des Rahmens graben wollen, gibt es ein paar Möglichkeiten, es zu tun:
1) Reflektor
2) MS vor kurzem die Quelle für Debugging-Zwecke geöffnet, können Sie Schritt in die sie mit VS2008, wenn Sie die Option unter Debugging/Optionen/Allgemein
3) ermöglichen Koders.com scheinen den Rahmen Quelle werden Hosting:
http://www.koders.com/csharp/fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109
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.
Haben Sie einen Link zu diesem Blogeintrag? –