public void CancelPendingIO() { lock (m_outstandingRequests.SyncRoot) { for (int i = m_outstandingRequests.Count - 1; i >= 0; i--) { AsyncFileStream_AsyncResult asfar = (AsyncFileStream_AsyncResult)m_outstandingRequests[i]; asfar.SignalCompleted(); } m_outstandingRequests.Clear(); } }
private unsafe IAsyncResult BeginWriteCore(byte[] array, int offset, int count, AsyncCallback userCallback, Object stateObject) { CheckParametersForBegin(array, offset, count); AsyncFileStream_AsyncResult asyncResult = new AsyncFileStream_AsyncResult(userCallback, stateObject, true); if (count == 0) { asyncResult.SignalCompleted(); } else { // Keep the array in one location in memory until the OS writes the // relevant data into the array. Free GCHandle later. asyncResult.PinBuffer(array); fixed(byte *p = array) { int numBytesWritten = 0; bool res; res = Native.WriteFile(m_handle.DangerousGetHandle(), p + offset, count, out numBytesWritten, asyncResult.OverlappedPtr); if (res == false) { if (HandleErrorSituation("BeginWrite", true)) { asyncResult.SignalCompleted(); } else { m_outstandingRequests.Add(asyncResult); } } } } return(asyncResult); }
// this callback is called by a free thread in the threadpool when the IO operation completes. unsafe private static void DoneCallback(uint errorCode, uint numBytes, NativeOverlapped *pOverlapped) { if (errorCode == Native.ERROR_OPERATION_ABORTED) { numBytes = 0; errorCode = 0; } // Unpack overlapped Overlapped overlapped = Overlapped.Unpack(pOverlapped); // Free the overlapped struct in EndRead/EndWrite. // Extract async result from overlapped AsyncFileStream_AsyncResult asyncResult = (AsyncFileStream_AsyncResult)overlapped.AsyncResult; asyncResult.m_numBytes = (int)numBytes; asyncResult.m_errorCode = (int)errorCode; asyncResult.SignalCompleted(); }
private unsafe IAsyncResult BeginReadCore(byte[] array, int offset, int count, AsyncCallback userCallback, Object stateObject) { CheckParametersForBegin(array, offset, count); AsyncFileStream_AsyncResult asyncResult = new AsyncFileStream_AsyncResult(userCallback, stateObject, false); if (count == 0) { asyncResult.SignalCompleted(); } else { // Keep the array in one location in memory until the OS writes the // relevant data into the array. Free GCHandle later. asyncResult.PinBuffer(array); fixed (byte* p = array) { int numBytesRead = 0; bool res; res = Native.ReadFile(m_handle.DangerousGetHandle(), p + offset, count, out numBytesRead, asyncResult.OverlappedPtr); if (res == false) { if (HandleErrorSituation("BeginRead", false)) { asyncResult.SignalCompleted(); } else { m_outstandingRequests.Add(asyncResult); } } } } return asyncResult; }