如果下载失败或成功,我如何测试文件下载并继续下载直到成功?

How can I test file download if download failed or success and keep downloading until success?

第一次下载时 TimeDate.Now 例如 15:57 所以我 RoundDown 将其格式化 15:55 并尝试下载它。

如果已完成的事件没有成功,我将再次尝试将其从 15:55 舍入到 15:50 格式并再次尝试下载。

问题是它没有再次向下舍入。在完成的事件中,如果此行有错误:

 current = RoundDown(current, TimeSpan.FromMinutes(-5));

它仍然是上面的四舍五入 15:55,我希望在下载不成功之前保持向下舍入并尝试下载新的向下舍入的新 currentLink。 15:50 not success make it 15:45 not success 15:40 依此类推并一遍又一遍地构建 currentLink 直到下载成功。

public void GetImages()
        {
            defaultlink = "https://IMSRadar/IMSRadar_";

            current = RoundDown(DateTime.Now, TimeSpan.FromMinutes(-5));
            var ct = current.ToString("yyyyMMddHHmm");
            currentLink = defaultlink + ct + ".gif";

            using (System.Net.WebClient wc = new System.Net.WebClient())
            {
                wc.DownloadFileCompleted += Wc_DownloadFileCompleted;
                wc.DownloadFileAsync(new Uri(currentLink), @"d:\test.gif");
            }
        }

        private void Wc_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                using (System.Net.WebClient wc = new System.Net.WebClient())
                {
                    current = RoundDown(current, TimeSpan.FromMinutes(-5));
                    var ct = current.ToString("yyyyMMddHHmm");
                    currentLink = defaultlink + ct + ".gif";
                    wc.DownloadFileCompleted += Wc_DownloadFileCompleted;
                    wc.DownloadFileAsync(new Uri(currentLink), @"d:\test.gif");
                }
            }
            else
            {
                GenerateRadarLinks();
            }
        }

RoundDown 方法

DateTime RoundDown(DateTime date, TimeSpan interval)
        {
            return new DateTime(date.Ticks / interval.Ticks *
                interval.Ticks);
        }

您的 roundDown 将在您到达一个已经是 5 分钟的倍数的日期后失效。想象一下:

假设整数除法 103 / 5 * 5 将得到 20 * 5 因此 100 如预期的那样。但是在下一次迭代中,你有 100 / 5 * 5 将再次给出 100,因为 100 / 5 == 103 / 5 == 20(整数除法)。

所以要让它起作用,您需要将时间至少减少一个刻度,这样它就不再是 5 分钟的倍数了。

DateTime RoundDown(DateTime date, TimeSpan interval) {
  return new DateTime((date.Ticks - 1)/ interval.Ticks * interval.Ticks);
}

我个人只会使用一次 RoundDown 方法来生成第一个时间戳,它是 5 的倍数。对于所有后续请求,我只使用当前时间戳并将其递减 5 分钟。

//inital timestamp
current = RoundDown(DateTime.Now, TimeSpan.FromMinutes(-5));

//in the error handler
current = current.AddMinutes(-5);