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:
parent
6a793c252f
commit
a1d75df47d
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue