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;
        }