我试图在每次计时器启动时更新TextBlock的文本.这是我的代码:

public static DateTime startTime;
System.Timers.Timer timer = new System.Timers.Timer(1000);
timer.AutoReset = true;
timer.Elapsed += Timer_Tick;
timer.Start();

private void Timer_Tick(object sender, EventArgs e)
{
    timerLabel.Text = DateTime.Now.Subtract(startTime).ToString(@"hh\:mm\:ss");
}

当我运行它时,我得到Exception thrown: 'System.Runtime.InteropServices.COMException' in WinRT.Runtime.dll.我在该函数中输入的所有其他代码都将运行,它只是不会更新我的TextBlock的文本.

如何修复此问题以在每过一秒时更新TextBlock的文本?我找到的每个答案似乎都不适用于WinUI 3.

推荐答案

System.Timers中的计时器将在非UI线程上滴答作响,因此您必须以某种方式使用Microsoft.UI.Dispatching.DispatcherQueue.

您可以使用当前Window上的一个线程,也可以使用DispatcherQueue.GetForCurrentThread method从当前线程(如果它有调度程序队列)获取一个线程.

然后您的代码可以这样编写:

private void Timer_Tick(object sender, EventArgs e) => DispatcherQueue.TryEnqueue(() =>
{
    timerLabel.Text = DateTime.Now.Subtract(startTime).ToString(@"hh\:mm\:ss");
});

请注意,您还可以将DispatcherQueue本身提供的计时器与DispatcherQueue.CreateTimer Method一起使用,DispatcherQueue.CreateTimer Method将自动在适当的线程中打钩.

Csharp相关问答推荐

使用嵌入在字符串中的大括号反序列化 JSON

ClientMessageInspectors 在 Xamarin 应用程序中不可用

我的 if 语句不起作用.我做错了什么?

如何重构这个大 if 条件

从多级列表中的任何位置删除对象(绕过图算法搜索)

如何在单个类中混合可空和不可空 T

如何使用 JSON.NET 将带有 null 的 json 数组反序列化为不可为空的 int 列表?

委托和等待任务

C# 根据另一个数组对数组的一部分进行排序

如何在输出目录中获取 C# 库文件?

是否可以为此限制泛型参数类型?

如何在保持初始和最终导数相同的同时zoom 贝塞尔曲线 t 值?

如何从 blazor 中的子项调用父 razor 组件中的函数?

分子 MC 模拟不平衡

如何有效地使用可用内存比较 1,000 张图像

C# WPF 窗口调整大小正在阻塞 NAudio WaveIn / WaveOut 流

是否有任何(可逆)方式(在c#中)将字符串转换为较小的字符串,当我说较小时,我的意思是“长度减少”?

ASP.Net Core 3.1 HttpClient 不重用套接字

如何有条件地更改 值? |剃刀 CSHTML

Raven.Client.Exceptions.Database.DatabaseDoesNotExistException:'数据库'*****'不存在