我正在尝试在.NET中使用Stream.BeginWrite异步I / O API,以获得包含许多短消息的高吞吐量情况。因此,分散/聚集API将极大地减少上下文切换(和CPU使用)的数量。这个API是否完全使用LPBUFFERS Win32 API?是否有Scatter / Gather I / O的替代API?
答案 0 :(得分:2)
查看.net来源,接受的答案似乎是错误的。
SocketAsyncEventArgs
具有BufferList
属性。当使用它时,操作可以使用分散/聚集DMA,而不是Buffer
属性只能容纳一个连续的内存块,因为Socket.SendAsync(SocketAsyncEventArgs)
在内部使用WSASend
,
允许指定多个发送缓冲区,使其适用于I / O的分散/聚集类型
和Socket.SendAsync(SocketAsyncEventArgs)
使用WSARecv
,即
允许指定多个接收缓冲区,使其适用于I / O的分散/聚集类型
我没有.net 3.5源码,但{。1}}自.net 3.5以来就存在,所以自.net 3.5以来可能支持scatter / gather。存在的WSASend和WSARecv的最低操作系统要求记录为Windows Vista / Server 2003。
N.B。我不知道你正在使用什么流,但BufferList
向WSASend发送一个缓冲区,所以你不能用它来进行分散/收集。
答案 1 :(得分:1)
如果你能从BCL那里得到分散/聚集api,我会感到惊讶(对于l33t w1n32 haxx0rz,你知道吗?),但是总有P / Invoke(令人惊讶的是很容易使用,我已经实测值)。
答案 2 :(得分:0)
如果你想深入了解框架的内容,有几种方法可以做到:
1)反射器
2)MS最近打开了用于调试目的的源代码,如果启用Debugging / Options / General
下的选项,可以使用VS2008进入它。3)Koders.com似乎也在托管框架源:
http://www.koders.com/csharp/fidCE09E83BE706D0BD370658C3785E82D3A13FC2CE.aspx?s=flush()#L109
答案 3 :(得分:-2)
在.NET中无法进行套接字分散/收集I / O.根据MSFT博客文章,.NET 4.5中可能存在类似的API(无论是什么......)