-8

这是我的估计时间代码。它正在工作,但时间有误。

if ((DateTime.Now - _startDate).Seconds > 0)
{
    kbPerSecond = (int)((100 * 1000) / 8);
}
long sent = (TotalBytes - BytesRead);
long remainingseconds = sent / kbPerSecond;
string remainingTimeDisplay = string.Empty;
if (remainingseconds > 0)
{
    if (remainingseconds > 60)
    {
        if (remainingseconds > 3600)
        {
            remainingTimeDisplay += ((int)(remainingseconds) / 3600).ToString("n0") + " Hours, ";
            remainingseconds %= 3600;
        }
        remainingTimeDisplay += (((int)remainingseconds) / 60).ToString("n0") + " Minutes,  ";
        remainingseconds %= 60;
    }
    remainingTimeDisplay += ((int)remainingseconds).ToString("n0") + " Seconds remaining";
    lbl_estimate.Text = remainingTimeDisplay;
}

问题在于下载完成后,估计的时间会显示为“剩余1秒”而不是零。

我究竟做错了什么?

4

3 回答 3

3

仅当您有remainingseconds超过 0 时才更改文本。您需要else在 1 日执行,if因此您需要类似以下内容:

    if (remainingseconds > 0)
                {
                    if (remainingseconds > 60)
                    {
                        if (remainingseconds > 3600)
                        {
                            remainingTimeDisplay += ((int)(remainingseconds) / 3600).ToString("n0") + " Hours, ";
                            remainingseconds %= 3600;
                        }
                        remainingTimeDisplay += (((int)remainingseconds) / 60).ToString("n0") + " Minutes,  ";
                        remainingseconds %= 60;
                    }
                    remainingTimeDisplay += ((int)remainingseconds).ToString("n0") + " Seconds remaining";
                    lbl_estimate.Text = remainingTimeDisplay;
                }
     else
           lbl_estimate.Text = "0 seconds";
于 2013-04-08T08:07:58.617 回答
1

为了简化这一点,您应该提取所有用于格式化持续时间字符串的逻辑。该逻辑不属于与函数的其余部分混淆!

此外,您可以使用以下方法简化它TimeSpan

public static string FormatDurationSeconds(int seconds)
{
    var duration = TimeSpan.FromSeconds(seconds);
    string result = "";

    if (duration.TotalHours >= 1)
        result += (int) duration.TotalHours + " Hours, ";

    result += String.Format("{0:%m} Minutes, {0:%s} Seconds", duration);
    return result;
}

完成此操作后,应该可以更轻松地了解秒数错误的原因。

于 2013-04-08T08:35:48.783 回答
1

您的数据速率是一个常数

kbPerSecond = (int)((100 * 1000) / 8);

这不可能。

于 2013-04-08T08:01:48.853 回答