private void ReadCallBack(IAsyncResult asyncResult)
        {
            lock (this.downloadAbortLock)
            {
                if (this.disposed || this.downloadAborted)
                {
                    return;
                }

                // Get the DownloadInfo object from AsyncResult.
                DownloadInfo info = (DownloadInfo)asyncResult.AsyncState;
                if (info == null)
                {
                    Abort();
                }

                // Retrieve the ResponseStream that was set in RespCallback.
                Stream responseStream = info.ResponseStream;
                if (responseStream == null)
                {
                    Abort();
                }

                // Read info.BufferRead to verify that it contains data.
                int bytesRead = responseStream.EndRead(asyncResult);
                if (bytesRead > 0)
                {
                    if (info.useFastBuffers)
                    {
                        System.Array.Copy(info.BufferRead, 0,
                                          info.dataBufferFast, info.bytesProcessed,
                                          bytesRead);
                    }
                    else
                    {
                        for (int b = 0; b < bytesRead; b++)
                        {
                            info.dataBufferSlow.Add(info.BufferRead[b]);
                        }
                    }
                    info.bytesProcessed += bytesRead;

                    // Perhaps we didn't originally get the content size, so we're
                    // just reading data with no end in sight.  If that's the casre,
                    // abort the download if we cross the max download size.
                    if (info.bytesProcessed > MaxDownloadSizeInBytes)
                    {
                        //System.Console.WriteLine("Download has become too big, aborting");
                        Abort();
                        return;
                    }

                    // If a registered progress-callback, inform it of our
                    // download progress so far.
                    if ((info.ProgressCallback != null) && (!this.downloadAborted))
                    {
                        info.ProgressCallback(info.Request.RequestUri.AbsoluteUri, info.bytesProcessed, info.dataLength);
                    }

                    // Continue reading data until responseStream.EndRead returns –1.
                    IAsyncResult ar = responseStream.BeginRead(
                        info.BufferRead, 0, BUFFER_SIZE,
                        new AsyncCallback(ReadCallBack), info);
                }
                else
                {
                    // We're done, signal completion
                    allDone.Set();
                }
            }
        }