欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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中定时器Timer与DispatcherTimer的用法

上面是一个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();
            }
        }
    }

输出结果如下,可以看出程序能够正常的运行

WPF中定时器Timer与DispatcherTimer的用法


转载于:https://www.cnblogs.com/QingYiShouJiuRen/p/10251572.html