C# 多线程实时时钟更新标签

C# 多线程实时时钟更新标签,c#,multithreading,xaml,uwp,windows-10-iot-core,C#,Multithreading,Xaml,Uwp,Windows 10 Iot Core,因此,我正在windows10iot核心上构建一个UWP应用程序和一个Raspberry Pi 3。现在,我想有一个实时时钟(不超载的一切),以获得准确的时间(从GPS接收,但nuw只是从系统) 我现在所做的,是做一个带有无穷大while循环的任务,获取时间并把它放到标签上。。。但是,我不明白为什么标签没有在while循环中得到更新,但它仍然在页面加载时得到更新。我使用的代码可以在下面找到: public sealed partial class Tripmaster : Page {

因此,我正在
windows10iot核心上构建一个UWP应用程序和一个
Raspberry Pi 3
。现在,我想有一个实时时钟(不超载的一切),以获得准确的时间(从GPS接收,但nuw只是从系统)

我现在所做的,是做一个带有无穷大while循环的任务,获取时间并把它放到标签上。。。但是,我不明白为什么标签没有在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”)输出并调试它(通过编写调试行),它可以工作,我能做什么?这对这个项目非常重要。

通过对代码进行越来越深入的搜索,我找到了一个解决方案

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

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);
                }
            });
        }

这就像一个符咒。

您的问题是在当前任务中尝试访问内存其他区域中的对象。解决方案是使用“代理”(对不起,我用手机写了回复格式…):


还有另一种解决方案。为了在UI线程上执行代码和更新元素的属性,您还可以使用MVVM Light framework来解决此问题。MVVM(模型-视图-视图-模型)是一种软件体系结构模式,它在UI控件及其逻辑之间提供了清晰的关注点分离。你可以参考这个

    Private delegate void changuestring (string text);
Private void changuetext (string text)
{
If (lbl_clock.invokerequired)
lbl_clock.invoke(new changuestring(changuetext), text);
Else
lbl_clock.text = text;
}



 private void start_clock()
 { 
// Init the clock and start the thread for the clock. 

Task.Run(() =>
 { 
while (true) 
{ 
changuetext( DateTime.Now.ToString("HH:mm:ss")); Debug.WriteLine(DateTime.Now.ToString("HH:mm:ss")); 
Task.Delay(500); 
} 
}); 
}