首页 > 解决方案 > 多线程实时时钟更新标签

问题描述

所以我正在构建一个 UWP 应用程序Windows 10 IoT Core和一个Raspberry Pi 3. 现在,我想要一个实时时钟(不会超载一切)来获得准确的时间(从 GPS 接收,但只是从系统接收)。

我现在所做的是在其中制作一个带有无限循环的任务,以获取时间并将其放在标签上......但是,我无法弄清楚为什么标签在那个while循环中没有得到更新,但它仍然会在页面加载时更新。我正在使用的代码可以在下面找到:

public sealed partial class Tripmaster : Page
{
    public Tripmaster()
    {
        this.InitializeComponent();

        lbl_clock.Text = DateTime.Now.ToString("HH:mm:ss");

        start_clock();

        btn_back.Click += Btn_back_Click;
    }

    private void start_clock()
    {
        // Init the clock and start the thread for the clock.
        Task.Run(() => {
            while (true)
            {
                lbl_clock.Text = DateTime.Now.ToString("HH:mm:ss");
                Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
                Task.Delay(500);
            }
        });
    }

    private void Btn_back_Click(object sender, RoutedEventArgs e)
    {
        this.Frame.Navigate(typeof(MainPage));
    }
}

所以lbl_clock.Text = DateTime.Now.ToString("HH:mm:ss");工作正常,但永远不会再次更新并在while循环中崩溃,知道如何让标签自动和(接近)实时更新吗?

如果我只是注释掉lbl_clock.Text = DateTime.Now.ToString("HH:mm:ss");并调试它(通过编写调试行),它可以工作,我该怎么办?这对这个项目非常重要。

标签: c#multithreadingxamluwpwindows-10-iot-core

解决方案


通过对代码进行更多更深入的搜索,我找到了解决方案。

所以我现在在私人空间中这样做:

private void start_clock()
        {
            // Init the clock and start the thread for the clock.
            Task.Run(async () => {
                while (true)
                {
                    await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                    {
                        this.lbl_clock.Text = DateTime.Now.ToString("HH:mm:ss");
                    });
                    await Task.Delay(500);
                }
            });
        }

这就像一个魅力。


推荐阅读