示例#1
0
        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();
            }
        }
示例#2
0
        public override void EndWrite(IAsyncResult asyncResult)
        {
            AsyncFileStream_AsyncResult afsar = CheckParameterForEnd(asyncResult, true);

            afsar.WaitCompleted();

            m_outstandingRequests.Remove(afsar);

            // Now check for any error during the write.
            if (afsar.m_errorCode != 0)
            {
                throw new IOException("Async Write failed", afsar.m_errorCode);
            }
        }
示例#3
0
        public override int EndRead(IAsyncResult asyncResult)
        {
            AsyncFileStream_AsyncResult afsar = CheckParameterForEnd(asyncResult, false);

            afsar.WaitCompleted();

            m_outstandingRequests.Remove(afsar);

            // Now check for any error during the read.
            if (afsar.m_errorCode != 0)
            {
                throw new IOException("Async Read failed", afsar.m_errorCode);
            }

            return(afsar.m_numBytes);
        }
示例#4
0
        private AsyncFileStream_AsyncResult CheckParameterForEnd(IAsyncResult asyncResult, bool isWrite)
        {
            if (asyncResult == null)
            {
                throw new ArgumentNullException("asyncResult");
            }

            AsyncFileStream_AsyncResult afsar = asyncResult as AsyncFileStream_AsyncResult;

            if (afsar == null || afsar.m_isWrite != isWrite)
            {
                throw new ArgumentException("asyncResult");
            }
            if (afsar.m_EndXxxCalled)
            {
                throw new InvalidOperationException("EndRead called twice");
            }
            afsar.m_EndXxxCalled = true;

            return(afsar);
        }
示例#5
0
        // 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();
        }
示例#6
0
        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);
        }
        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;
        }