55 lines
2.0 KiB
C#
55 lines
2.0 KiB
C#
|
//------------------------------------------------------------------------------
|
||
|
// <copyright file="ReadAsyncResult.cs" company="Microsoft">
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
// </copyright>
|
||
|
//------------------------------------------------------------------------------
|
||
|
|
||
|
/*
|
||
|
* IAsyncResult for asynchronous read.
|
||
|
*
|
||
|
* Copyright (c) 2010 Microsoft Corporation
|
||
|
*/
|
||
|
|
||
|
namespace System.Web.Hosting {
|
||
|
using System;
|
||
|
using System.Threading;
|
||
|
using System.Web.Util;
|
||
|
|
||
|
internal class ReadAsyncResult : AsyncResultBase {
|
||
|
private int _bytesRead;
|
||
|
private byte[] _buffer;
|
||
|
private int _offset;
|
||
|
private int _count;
|
||
|
private bool _updatePerfCounter;
|
||
|
|
||
|
internal ReadAsyncResult(AsyncCallback cb, Object state, byte[] buffer, int offset, int count, bool updatePerfCounter): base(cb, state) {
|
||
|
_buffer = buffer;
|
||
|
_offset = offset;
|
||
|
_count = count;
|
||
|
_updatePerfCounter = updatePerfCounter;
|
||
|
}
|
||
|
|
||
|
internal override void Complete(int bytesRead, int hresult, IntPtr pbAsyncReceiveBuffer, bool synchronous) {
|
||
|
if (_updatePerfCounter && bytesRead > 0) {
|
||
|
PerfCounters.IncrementCounterEx(AppPerfCounter.REQUEST_BYTES_IN, bytesRead);
|
||
|
}
|
||
|
|
||
|
if (bytesRead != 0) {
|
||
|
CopyBytes(pbAsyncReceiveBuffer, bytesRead);
|
||
|
}
|
||
|
_bytesRead = bytesRead;
|
||
|
|
||
|
Complete(hresult, synchronous);
|
||
|
}
|
||
|
|
||
|
private unsafe void CopyBytes(IntPtr pbAsyncReceiveBuffer, int bytesRead) {
|
||
|
byte * src = ((byte *)pbAsyncReceiveBuffer);
|
||
|
fixed (byte * dst = _buffer) {
|
||
|
StringUtil.memcpyimpl(src, dst + _offset, bytesRead);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
internal int BytesRead { get { return _bytesRead; } set { _bytesRead = value; } }
|
||
|
}
|
||
|
}
|