public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
        {
            var asyncResult = new CombinationStreamAsyncResult(state);

            if (count > 0)
            {
                int buffPostion = offset;

                AsyncCallback rc = null;
                rc = readresult =>
                {
                    try
                    {
                        int bytesRead = _currentStream.EndRead(readresult);
                        asyncResult.BytesRead += bytesRead;
                        buffPostion           += bytesRead;
                        _postion += bytesRead;

                        if (bytesRead <= count)
                        {
                            count -= bytesRead;
                        }

                        if (count > 0)
                        {
                            if (_currentStreamIndex >= _streams.Count)
                            {
                                // done
                                asyncResult.CompletedSynchronously = false;
                                asyncResult.SetAsyncWaitHandle();
                                asyncResult.IsCompleted = true;
                                callback(asyncResult);
                            }
                            else
                            {
                                _currentStream = _streams[_currentStreamIndex++];
                                _currentStream.BeginRead(buffer, buffPostion, count, rc, readresult.AsyncState);
                            }
                        }
                        else
                        {
                            // done
                            asyncResult.CompletedSynchronously = false;
                            asyncResult.SetAsyncWaitHandle();
                            asyncResult.IsCompleted = true;
                            callback(asyncResult);
                        }
                    }
                    catch (Exception ex)
                    {
                        // done
                        asyncResult.Exception = ex;
                        asyncResult.CompletedSynchronously = false;
                        asyncResult.SetAsyncWaitHandle();
                        asyncResult.IsCompleted = true;
                        callback(asyncResult);
                    }
                };
                _currentStream.BeginRead(buffer, buffPostion, count, rc, state);
            }
            else
            {
                // done
                asyncResult.CompletedSynchronously = true;
                asyncResult.SetAsyncWaitHandle();
                asyncResult.IsCompleted = true;
                callback(asyncResult);
            }

            return(asyncResult);
        }
        public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state)
        {
            CombinationStreamAsyncResult asyncResult = new CombinationStreamAsyncResult(state);
            if (count > 0)
            {
                int buffPostion = offset;

                AsyncCallback rc = null;
                rc = readresult =>
                         {
                             try
                             {
                                 int bytesRead = _currentStream.EndRead(readresult);
                                 asyncResult.BytesRead += bytesRead;
                                 buffPostion += bytesRead;
                                 _postion += bytesRead;

                                 if (bytesRead <= count)
                                     count -= bytesRead;

                                 if (count > 0)
                                 {
                                     if (_currentStreamIndex >= _streams.Count)
                                     {
                                         // done
                                         asyncResult.CompletedSynchronously = false;
                                         asyncResult.SetAsyncWaitHandle();
                                         asyncResult.IsCompleted = true;
                                         callback(asyncResult);
                                     }
                                     else
                                     {
                                         _currentStream = _streams[_currentStreamIndex++];
                                         _currentStream.BeginRead(buffer, buffPostion, count, rc, readresult.AsyncState);
                                     }
                                 }
                                 else
                                 {
                                     // done
                                     asyncResult.CompletedSynchronously = false;
                                     asyncResult.SetAsyncWaitHandle();
                                     asyncResult.IsCompleted = true;
                                     callback(asyncResult);
                                 }
                             }
                             catch (Exception ex)
                             {
                                 // done
                                 asyncResult.Exception = ex;
                                 asyncResult.CompletedSynchronously = false;
                                 asyncResult.SetAsyncWaitHandle();
                                 asyncResult.IsCompleted = true;
                                 callback(asyncResult);
                             }
                         };
                _currentStream.BeginRead(buffer, buffPostion, count, rc, state);
            }
            else
            {
                // done
                asyncResult.CompletedSynchronously = true;
                asyncResult.SetAsyncWaitHandle();
                asyncResult.IsCompleted = true;
                callback(asyncResult);
            }

            return asyncResult;
        }