WPF中定时器Timer与DispatcherTimer的用法
程序员文章站
2021-12-03 09:00:22
最近的工作项目中需要定时更新UI控件中的数据,这时候第一反应肯定会想到去使用System.Timers.Timer定时更新UI控件,但是程序运行后,会发现程序...
最近的工作项目中需要定时更新UI控件中的数据,这时候第一反应肯定会想到去使用System.Timers.Timer定时更新UI控件,但是程序运行后,会发现程序崩溃了。报的异常为“调用线程无法访问此对象,因为另一个线程拥有该对象。”,网上查找了原因,Timer的触发事件与UI不是属于同一个线程,所以说在Timer的触发事件去更新UI时,会造成UI对象被占用的问题。网上说,可以尝试用DispatcherTimer这个定时器去更新UI,于是我做个一个demo测试了一下,果然是可行的。
上面是一个WPF窗口,点击计时按钮,编辑框中显示计时次数
1.使用System.Timers.Timer更新编辑框中的数据
namespace Timer { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { System.Timers.Timer timer = null; private static int nCount = 0; public MainWindow() { InitializeComponent(); timer = new System.Timers.Timer(1000); timer.AutoReset = true; timer.Elapsed += new ElapsedEventHandler(TimeAction); } private void TimeAction(object sender, ElapsedEventArgs e) { if (!String.IsNullOrEmpty(txt_TimeCount.Text)) { //计时次数大于10时,则关闭定时器 if (Convert.ToInt32(txt_TimeCount.Text) > 10) { timer.Stop(); } } txt_TimeCount.Text = Convert.ToString(nCount++); } private void btn_Time_Click(object sender, RoutedEventArgs e) { timer.Start(); } } }
当点击按钮后,会很明显的出现上述所说的异常问题
2.使用DispatcherTimer更新编辑框中的数据
namespace Timer { /// <summary> /// MainWindow.xaml 的交互逻辑 /// </summary> public partial class MainWindow : Window { DispatcherTimer dispatcherTimer = null; private static int nCount = 0; public MainWindow() { InitializeComponent(); dispatcherTimer = new DispatcherTimer(); dispatcherTimer.Interval = new TimeSpan(0, 0, 1); dispatcherTimer.Tick += new EventHandler(TimeAction); } private void TimeAction(object sender, EventArgs e) { if (!String.IsNullOrEmpty(txt_TimeCount.Text)) { //计时次数大于10时,则关闭定时器 if (Convert.ToInt32(txt_TimeCount.Text) > 10) { dispatcherTimer.Stop(); } } txt_TimeCount.Text = Convert.ToString(nCount++); } private void btn_Time_Click(object sender, RoutedEventArgs e) { dispatcherTimer.Start(); } } }
输出结果如下,可以看出程序能够正常的运行
转载于:https://www.cnblogs.com/QingYiShouJiuRen/p/10251572.html
推荐阅读
-
小码农的代码(四)----------JAVA中Timer定时器与Spring定时任务
-
WPF中定时器Timer与DispatcherTimer的用法
-
javascript中SetInterval与setTimeout的定时器用法
-
javascript中SetInterval与setTimeout的定时器用法
-
定时器的实现、java定时器Timer和Quartz介绍与Spring中定时器的配置
-
javascript中SetInterval与setTimeout的定时器用法_javascript技巧
-
小码农的代码(四)----------JAVA中Timer定时器与Spring定时任务
-
javascript中SetInterval与setTimeout的定时器用法_javascript技巧
-
定时器的实现、java定时器Timer和Quartz介绍与Spring中定时器的配置
-
WPF中定时器Timer与DispatcherTimer的用法