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