2008-09-22 9 views
2

J'essaie d'utiliser l'API d'E/S Async Stream.BeginWrite dans .NET pour une situation à haut débit avec de nombreux messages courts. En tant que tel, une API scatter/gather réduit énormément le nombre de commutateurs de contexte (et d'utilisation du processeur). Cette API utilise-t-elle l'API LPBUFFERS Win32? Existe-t-il une autre API pour Scatter/Gather I/O?Scatter/rassembler des E/S socket asynchrones dans .NET

Répondre

-2

Il n'y a aucun moyen de faire des E/S socket scatter/gather dans .NET. Selon un article de blog MSFT, il peut y avoir une API similaire dans .NET 4.5 (quoi que ce soit ...)

+0

Avez-vous un lien vers cet article? –

1

Je serais surpris si vous pouviez obtenir les APIs de scatter/gather de la BCL (c'est pour le l33t w1n32 haxx0rz, vous savez?), Mais il y a toujours P/Invoke (qui est étonnamment facile à utiliser, je ' J'ai trouvé).

2

En regardant les sources .net, la réponse acceptée semble être fausse.

SocketAsyncEventArgs a un attribut BufferList. Lorsque cela est utilisé, au lieu de l'attribut Buffer qui ne peut contenir un seul bloc contigu de mémoire, les opérations peuvent utiliser scatter/gather DMA, comme Socket.SendAsync(SocketAsyncEventArgs) utilise WSASend en interne, que

permet des tampons multiples émission à spécifié rendant applicable à la ventilation/regroupement type d'E/S

et Socket.SendAsync(SocketAsyncEventArgs) utilise WSARecv que

permet à de multiples tampons de réception à préciser le rendant applicable au scatter/gather type d'E/S

Je n'ai pas le .net 3.5 sources à portée de main, mais BufferList existe depuis 3,5 .net, donc scatter/gather aurait pu être pris en charge depuis .net 3.5. La configuration minimale requise pour WSASend et WSARecv est documentée sous Windows Vista/Server 2003.

N.B. Je ne sais pas quel flux vous utilisez, mais NetworkStream.BeginWrite envoie un seul tampon au WSASend, donc vous ne pouvez pas l'utiliser pour disperser/rassembler.