private static void WriteCallback(IAsyncResult asyncResult)
        {
            AsyncStreamOperations writer = (AsyncStreamOperations)asyncResult.AsyncState;

            writer.stream.EndWrite(asyncResult);
            writer.Dispose();
            if (writer.writerCallback != null)
            {
                writer.writerCallback(writer.userState);
            }
            writer = null;
        }
        private static void ReadCallback(IAsyncResult asyncResult)
        {
            AsyncStreamOperations loader = (AsyncStreamOperations)asyncResult.AsyncState;
            int loaded = loader.stream.EndRead(asyncResult);

            if (asyncResult.IsCompleted && loaded > 0)
            {
                loader.memoryStream.Write(loader.tileBodyPart, 0, loaded);
                loader.stream.BeginRead(loader.tileBodyPart, 0, TileBodyPartLength, ReadCallback, loader);
                return;
            }

            byte[] tile = loader.memoryStream.ToArray();
            loader.Dispose();

            loader.readerCallback(tile);
            loader = null;
        }