c# - 多线程实时时钟更新标签
问题描述
所以我正在构建一个 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");
并调试它(通过编写调试行),它可以工作,我该怎么办?这对这个项目非常重要。
解决方案
通过对代码进行更多更深入的搜索,我找到了解决方案。
所以我现在在私人空间中这样做:
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);
}
});
}
这就像一个魅力。
推荐阅读
- firebase - Firebase 部署错误:无法分配区域
- python - 在图表上查找路径。这可以通过访问所有点并计算距离来帮助我
- mysql - 如何在 MySQL 中添加额外的标题行
- c++ - 使用模板函数初始化 constexpr 数组
- android - 如何修复出现在底部导航活动下方的片段?
- c - 阻塞与非阻塞 I/O 缓冲?
- java - 如何在spring data jpa中为自定义采石场提供可变参数而不使用for循环
- java - 根据目标日期查找最近的 startDate 和 endDate 的最佳方法
- python - 加盟产楠
- ruby-on-rails - 将activerecord保存在DB上时,如何使Rails使用属性的getter方法?