public override void Complete() { Debug.Assert((CompletionFlags & (OperationCompletionFlags.OperationCancelled | OperationCompletionFlags.OperationFinished)) != 0); ResetOperationState(); _readNotWrite = IsReadNotWrite; var completionFlags = CompletionFlags; Saea.Complete(completionFlags); if ((completionFlags & OperationCompletionFlags.CompletedCanceledSync) == OperationCompletionFlags.CompletedCanceledSync) { // Caller threw an exception which prevents further use of this. ResetAndReturnThis(); } else { _vts.SetResult(0); ManualResetEventSlim?mre = Interlocked.Exchange(ref _mre, s_completedSentinel); // This ManualResetEventSlim is used to wait until the operation completed. // After that a direct call is made to get the result. mre?.Set(); } }
/// <summary> /// Releases all resources used by <see cref="SaeaAwaitable" />. /// </summary> public void Dispose() { lock (SyncRoot) { if (!IsDisposed) { Saea.Dispose(); IsDisposed = true; } } }
void IThreadPoolWorkItem.Execute() { // Capture state. OperationCompletionFlags completionStatus = CompletionFlags; // Reset state. CompletionFlags = OperationCompletionFlags.None; CurrentAsyncContext = null; // Complete. Saea.Complete(completionStatus); }
/// <summary> /// Clear properties to prepare /// <see cref="SaeaAwaitable" /> for pooling. /// </summary> public void ClearAndResetSaeaProperties() { Saea.SocketFlags = SocketFlags.None; Saea.SocketError = SocketError.Success; Saea.SendPacketsSendSize = 0; Saea.SendPacketsElements = null; Saea.DisconnectReuseSocket = false; Saea.BufferList = null; Saea.AcceptSocket = null; Saea.RemoteEndPoint = null; Saea.UserToken = null; if (_initBufferSize != MAGIC) { // restore buffer Saea.SetBuffer(0, _initBufferSize); } }