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