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