[英]C#: How can I make the clock work correctly?
我正在使用 Visual Studio 2022 开发一个名为 Charms Bar Port的新存储库 GitHub,它要求 UI 在左下方显示时钟和日期,如此图所示。
但是,无论是否存在,时钟似乎都不会更新:
有没有一个很好的方法可以在一个循环中持续跟踪时间?
使用来自外部来源的后台工作人员和/或计时器的一些代码从未起作用。 例如:即使时间是“9:00”,“8:34”也会卡在屏幕上。
Timer t = new Timer();
private void Form1_Load(object sender, EventArgs e)
{
// Normally, the timer is declared at the class level, so that it stays in scope as long as it
// is needed. If the timer is declared in a long-running method, KeepAlive must be used to prevent
// the JIT compiler from allowing aggressive garbage collection to occur before the method ends.
// You can experiment with this by commenting out the class-level declaration and uncommenting
// the declaration below; then uncomment the GC.KeepAlive(aTimer) at the end of the method.
//System.Timers.Timer aTimer;
// Create a timer and set a two second interval.
t = new System.Timers.Timer();
t.Interval = 2000;
// Create a timer with a two second interval.
//t = new System.Timers.Timer(2000);
// Hook up the Elapsed event for the timer.
t.Elapsed += OnTimedEvent;
// Have the timer fire repeated events (true is the default)
t.AutoReset = true;
// Start the timer
t.Enabled = true;
// If the timer is declared in a long-running method, use KeepAlive to prevent garbage collection
// from occurring before the method ends.
GC.KeepAlive(t);
}
//timer eventhandler
private void OnTimedEvent(object sender, EventArgs e)
{
//update label
Date.Content = DateTime.Today.ToString("MMMM d");
Week.Content = DateTime.Today.ToString("dddd");
Clocks.Content = DateTime.Now.ToString("hh:mm");
t.Enabled = true;
}
}
您应该使用调度程序从不同的线程更新 UI。
你的代码应该是:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
_initTimer();
}
private Timer t = null;
private readonly Dispatcher dispatcher = Dispatcher.CurrentDispatcher;
private void _initTimer()
{
t = new System.Timers.Timer();
t.Interval = 1000;
t.Elapsed += OnTimedEvent;
t.AutoReset = true;
t.Enabled = true;
t.Start();
}
private void OnTimedEvent(object sender, ElapsedEventArgs e)
{
dispatcher.BeginInvoke((Action)(() =>
{
DateTime today = DateTime.Now;
Clocks.Content = today.ToString("hh:mm:ss");
// do additional things with captured 'today' variable.
}));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.