protected override void Dispose(bool disposing) { if (!_disposed) { _disposed = true; if (disposing) { // TODO (Issue 2508): Pinned buffers must be released in the callback, when it is guaranteed no further // operations will be made to the send/receive buffers. if (_cachedReceivePinnedBuffer.IsAllocated) { _cachedReceivePinnedBuffer.Free(); } if (_state.RequestHandle != null) { _state.RequestHandle.Dispose(); _state.RequestHandle = null; } _state.Dispose(); } } base.Dispose(disposing); }
private static void OnRequestHandleClosing(WinHttpRequestState state) { Debug.Assert(state != null, "OnRequestSendRequestComplete: state is null"); // This is the last notification callback that WinHTTP will send. Therefore, we can // now explicitly dispose the state object which will free its corresponding GCHandle. // This will then allow the state object to be garbage collected. state.Dispose(); }
private RendezvousAwaitable<int> InternalSendRequestAsync(WinHttpRequestState state) { lock (state.Lock) { state.Pin(); if (!Interop.WinHttp.WinHttpSendRequest( state.RequestHandle, null, 0, IntPtr.Zero, 0, 0, state.ToIntPtr())) { // Dispose (which will unpin) the state object. Since this failed, WinHTTP won't associate // our context value (state object) to the request handle. And thus we won't get HANDLE_CLOSING // notifications which would normally cause the state object to be unpinned and disposed. state.Dispose(); WinHttpException.ThrowExceptionUsingLastError(); } } return state.LifecycleAwaitable; }
private Task<bool> InternalSendRequestAsync(WinHttpRequestState state) { state.TcsSendRequest = new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously); lock (state.Lock) { state.Pin(); if (!Interop.WinHttp.WinHttpSendRequest( state.RequestHandle, null, 0, IntPtr.Zero, 0, 0, state.ToIntPtr())) { // Dispose (which will unpin) the state object. Since this failed, WinHTTP won't associate // our context value (state object) to the request handle. And thus we won't get HANDLE_CLOSING // notifications which would normally cause the state object to be unpinned and disposed. state.Dispose(); WinHttpException.ThrowExceptionUsingLastError(); } } return state.TcsSendRequest.Task; }