Use new Memory<byte> APIs on SocketAsyncEventArgs (#2173)

- This should improve the performance of handling buffers by (eventually)
removing GCHandle churn for Kestrel's already pinned buffers.
- Made the Sockets transport target both netcoreapp2.1 and netstandard2.0 to use new
APIs
- Disable API check for the sockets transport
This commit is contained in:
David Fowler 2017-11-20 11:36:09 -08:00 committed by Stephen Halter
parent 6a793c252f
commit a1d75df47d
3 changed files with 12 additions and 5 deletions

View File

@ -21,10 +21,13 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
public SocketAwaitable ReceiveAsync(Memory<byte> buffer) public SocketAwaitable ReceiveAsync(Memory<byte> buffer)
{ {
#if NETCOREAPP2_1
_eventArgs.SetBuffer(buffer);
#else
var segment = buffer.GetArray(); var segment = buffer.GetArray();
_eventArgs.SetBuffer(segment.Array, segment.Offset, segment.Count); _eventArgs.SetBuffer(segment.Array, segment.Offset, segment.Count);
#endif
if (!_socket.ReceiveAsync(_eventArgs)) if (!_socket.ReceiveAsync(_eventArgs))
{ {
_awaitable.Complete(_eventArgs.BytesTransferred, _eventArgs.SocketError); _awaitable.Complete(_eventArgs.BytesTransferred, _eventArgs.SocketError);

View File

@ -48,16 +48,19 @@ namespace Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal
private SocketAwaitable SendAsync(Memory<byte> buffer) private SocketAwaitable SendAsync(Memory<byte> buffer)
{ {
var segment = buffer.GetArray();
// The BufferList getter is much less expensive then the setter. // The BufferList getter is much less expensive then the setter.
if (_eventArgs.BufferList != null) if (_eventArgs.BufferList != null)
{ {
_eventArgs.BufferList = null; _eventArgs.BufferList = null;
} }
_eventArgs.SetBuffer(segment.Array, segment.Offset, segment.Count); #if NETCOREAPP2_1
_eventArgs.SetBuffer(buffer);
#else
var segment = buffer.GetArray();
_eventArgs.SetBuffer(segment.Array, segment.Offset, segment.Count);
#endif
if (!_socket.SendAsync(_eventArgs)) if (!_socket.SendAsync(_eventArgs))
{ {
_awaitable.Complete(_eventArgs.BytesTransferred, _eventArgs.SocketError); _awaitable.Complete(_eventArgs.BytesTransferred, _eventArgs.SocketError);

View File

@ -4,11 +4,12 @@
<AssemblyName>Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets</AssemblyName> <AssemblyName>Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets</AssemblyName>
<RootNamespace>Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets</RootNamespace> <RootNamespace>Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets</RootNamespace>
<Description>Managed socket transport for the ASP.NET Core Kestrel cross-platform web server.</Description> <Description>Managed socket transport for the ASP.NET Core Kestrel cross-platform web server.</Description>
<TargetFramework>netstandard2.0</TargetFramework> <TargetFrameworks>netstandard2.0;netcoreapp2.1</TargetFrameworks>
<GenerateDocumentationFile>true</GenerateDocumentationFile> <GenerateDocumentationFile>true</GenerateDocumentationFile>
<PackageTags>aspnetcore;kestrel</PackageTags> <PackageTags>aspnetcore;kestrel</PackageTags>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
<NoWarn>CS1591;$(NoWarn)</NoWarn> <NoWarn>CS1591;$(NoWarn)</NoWarn>
<EnableAPICheck>false</EnableAPICheck>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>