public void DownloadChunks() { logger.LogTechState("Downloading chunk data..."); const int maxFails = 5; Parallel.ForEach(chunks, chunkXY => { int fails; bool success = false; do { fails = 0; try { logger.LogDebug($"DownloadChunks(): downloading chunk {chunkXY}"); byte[] data = HttpWrapper.GetChunkData(chunkXY); BinaryConversion.DropPixelProtectionInfo(data); CachedChunks[chunkXY] = BinaryConversion.ToColorRectangle(data, PixelMap.ChunkSideSize, PixelMap.ChunkSideSize); logger.LogDebug($"DownloadChunks(): downloaded chunk {chunkXY}"); success = true; } catch (Exception ex) { logger.LogDebug($"DownloadChunks(): error - {ex.Message}"); if (++fails == maxFails) { fails = 0; logger.LogDebug($"DownloadChunks(): {maxFails} fails in row, pause 30s"); Thread.Sleep(TimeSpan.FromSeconds(30)); break; } } } while (!success); }); logger.LogTechInfo("Chunk data is downloaded"); OnMapUpdated?.Invoke(this, null); }