我在 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 分钟,包括毫秒、秒和分钟。
我认为实现此目的的最简单方法之一是使用一个单独的线程,该线程始终等待系统空闲,如果空闲,您可以更新文本框:
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();
你的错误是不介意你的单位。
在一处
countdownSeconds
设置为 300 秒。但在计时器滴答事件处理程序中 - 由于某些奇怪的原因 - 您将该数字视为毫秒。导致
每 300 毫秒翻转一次。
然后将它们解析为 TimeSpan FromMilliseconds。所以你只会看到 300ms、200ms、100ms 和 0。
现在我们已经确定了错误,我建议您完全不要这样做。
设置目标时间戳(例如“现在”+ 5 分钟)并在刻度处理程序中通过“目标 - 现在”进行更新。要重置,请将目标再次设置为“现在 + 5 分钟”。