WPF中DispatcherTimer和Timer的区别

  • 今天突然发现程序中有个问题就是在运行的时候整个UI界面卡住无法响应。
  • 定位了一定才发现是在一个定时任务里面进行接口请求的时候超时导致定时任务线程卡住。
  • 我之前并不是很清楚DispatcherTimer和Timer的实质区别。想当然的认为都是创建一个定时任务的线程。没想到这个想当然却导致了一次程序BUG。
  • 学术还是应该严谨一点是吧。。。
  • System.Windows.Threading.DispatcherTimer
private static DispatcherTimer InvUloadDispatcher = new DispatcherTimer();
InvUloadDispatcher.Interval = new TimeSpan(0, 0, 10);

                InvUloadDispatcher.Tick += (sender, arg) =>
                {
                    System.Threading.Thread.Sleep(1000 * 100);
                };
                InvUloadDispatcher.Start();
  • System.Timers.Timer
private static System.Timers.Timer InvUloadDispatcher;
 /// 
        /// 定时timer
        /// 
        private void TimingInvUploadTask()
        {
            InvUloadDispatcher = new System.Timers.Timer(1000 * 900);// 每十五分钟上传检查上传一次

            InvUloadDispatcher.AutoReset = true;// 是否重复调用 Elapsed事件方法,如果为false 则Elapsed 事件方法就只会调用一次。这里就是TimeAction方法就只会调用一次

            InvUloadDispatcher.Elapsed += new System.Timers.ElapsedEventHandler(TimeAction);

            InvUloadDispatcher.Start();
        }
        /// 
        /// 
        /// 
        /// 
        /// 
        private void TimeAction(object sender, System.Timers.ElapsedEventArgs e)
        {
            System.Threading.Thread.Sleep(1000 * 100);
        }
  • 这两种都试了一下 发现Timer是不卡UI线程的。查询资料后才知道。原来DispatcherTimer是和UI处于同一线程,好处就是他可以直接更新UI界面的内容。(不好的地方就是:在DispatcherTimer里面执行等待动作或者时间过长,可能会导致UI假死)而如果使用Timer直接更新UI内容会报异常,必须使用异步更新。使用Invoke或者BeginInvoke的方式进行UI的更新。
  • 关于DispatcherTimer和Timer区别介绍的原文档
  • 上个截图吧!
  • WPF中DispatcherTimer和Timer的区别_第1张图片
  • 英语不好的谷歌自动翻译一下O(∩_∩)O哈哈~
  • WPF中DispatcherTimer和Timer的区别_第2张图片

你可能感兴趣的:(wpf,microsoft,ui)