繁体   English   中英

C#:如何让时钟正常工作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM