public async Task DownloadAsync(MultiMirrorFileDownloadSpec spec) { spec.Start(); try { while (true) { var host = _mirrorStrategy.GetHost(); spec.UpdateHost(host); if (await TryDownloadAsync(spec, host).ConfigureAwait(false)) break; ResetSpec(spec); await Task.Delay(MillisecondsTimeout).ConfigureAwait(false); } } catch (Exception) { spec.Fail(); throw; } }