如何显示倒计时5分钟的计时器?

问题描述 投票:0回答:2

我在 form1 设计器中添加了一个计时器。

在表格 1 的顶部:

private int countdownSeconds = 300; // 5 minutes
private Stopwatch stopwatch = new Stopwatch();

form1 构造函数:

public Form1()
{
    InitializeComponent();

    timer1.Interval = 100; // Update every 100 milliseconds
    StartTimer();
    DownloadFolderViewerButtonStates();
    ResetUI();
    graphicsDrawer = new GraphicsDrawer();
    startTime = DateTime.Now;
}

StartTimer方法:

private void StartTimer()
{
    countdownSeconds = 300; // Reset the countdown time
    stopwatch.Restart();
    timer1.Start();
}

定时器滴答事件:

private async void timer1_Tick(object sender, EventArgs e)
{
    countdownSeconds -= 100; // Subtract the timer interval (100 milliseconds) from the countdown

    if (countdownSeconds <= 0)
    {
        timer1.Stop();
        radar = new Radar(downloadFolder);
        await radar.PrepareLinksAsync(); // Use await here
        DownloadFiles(radar.links);
        StartTimer(); // Restart the timer after the download is complete
    }

    TimeSpan remainingTime = TimeSpan.FromMilliseconds(countdownSeconds);

    // Display time with milliseconds
    lblTimer.Text = $"{remainingTime.Hours:D2}:{remainingTime.Minutes:D2}:{remainingTime.Seconds:D2}:{(int)remainingTime.TotalMilliseconds:D3}";
}

问题是,在毫秒内,我看到 3 位数字,如 000,第一个零位数字在 1 和 3 之间变化,如:100 然后“跳”到 300 或 200 等等,最后一位数字在 1 和 3 之间.

分和秒保持在 00:00

但我希望它像一个计时器,可以倒计时 5 分钟,包括毫秒、秒和分钟。

c# winforms
2个回答
0
投票

我认为实现此目的的最简单方法之一是使用一个单独的线程,该线程始终等待系统空闲,如果空闲,您可以更新文本框:

    var endTime = DateTime.Now + TimeSpan.FromMinutes(5);
    Thread countdownThread = new Thread(() =>
    {
        while (true)
        {
            Application.Current.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.SystemIdle, new Action(() =>//this needs to happen on the gui thread so we dispatch it
            {
                tbTimer.Text = (endTime - DateTime.Now).ToString();
            }));
        }
    });
    countdownThread.IsBackground = true;
    countdownThread.Start();


0
投票

你的错误是不介意你的单位。

在一处

countdownSeconds
设置为 300 。但在计时器滴答事件处理程序中 - 由于某些奇怪的原因 - 您将该数字视为毫秒。导致 每 300 毫秒翻转一次。

然后将它们解析为 TimeSpan FromMilliseconds。所以你只会看到 300ms、200ms、100ms 和 0。


现在我们已经确定了错误,我建议您完全不要这样做

设置目标时间戳(例如“现在”+ 5 分钟)并在刻度处理程序中通过“目标 - 现在”进行更新。要重置,请将目标再次设置为“现在 + 5 分钟”。

© www.soinside.com 2019 - 2024. All rights reserved.