其他答案缺少适当的清理:当计时器在窗口关闭的那一刻触发时,我会在尝试运行时收到未捕获的 TaskCanceledException Dispatcher.Invoke
。我没有在其他问题中找到解决此问题的帮助。我能够通过在关闭窗口时取消注册计时器回调来解决它。
public partial class MainWindow : Window
{
Timer clockTimer = null;
public MainWindow()
{
clockTimer = new Timer(1.0); // 1 ms update to test for TaskCanceledException
clockTimer.Elapsed += Timer_Elapsed;
clockTimer.AutoReset = true;
clockTimer.Start();
Closed += (object sender, EventArgs e) => { clockTimer.Elapsed -= Timer_Elapsed; };
}
private void Timer_Elapsed(object sender, ElapsedEventArgs e) {
var now = DateTime.Now;
Dispatcher.Invoke((Action)delegate () {
UpdateTime(now);
});
}
}
如果重新显示窗口,显然这不是一个好主意。我尝试添加一个 dtor,但它永远不会被调用,可能是由于循环依赖。
免责声明:我不懂 C#,所以这可能不是最好或正确的做事方式。