zoukankan      html  css  js  c++  java
  • WPF DispatcherTimer一些个人看法 (原发布 csdn 2017-04-25 19:12:22)

    wpf中的DispatcherTimer基本用法,本文不在叙述。主要写一些不同的,来提醒自己不要再犯同样错误。

    前几天写代码时发现。当在非UI线程创建DispatcherTimer实例时,程序无法进入Tick事件

    private static System.Windows.Threading.DispatcherTimer timer;
    
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        new System.Threading.Thread(CreateTimer).Start();
    }
    
    private void CreateTimer()
    {
        timer = new System.Windows.Threading.DispatcherTimer();
        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Tick += DispatcherTimer_Click;
        timer.Start();
    }
    
    private void DispatcherTimer_Click(object sender, EventArgs e)
    {
        Console.WriteLine("DispatcherTimer_Click");
    }
    

    在DispatcherTimer_Click函数入口设断点,发现程序无法进入。

    如果这样创建对象

    private static System.Windows.Threading.DispatcherTimer timer;
    
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        new System.Threading.Thread(CreateTimer).Start();
    }
    
    private void CreateTimer()
    {
        timer = new System.Windows.Threading.DispatcherTimer(System.Windows.Threading.DispatcherPriority.SystemIdle, this.Dispatcher);
        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Tick += DispatcherTimer_Click;
        timer.Start();
    }
    
    private void DispatcherTimer_Click(object sender, EventArgs e)
    {
        Console.WriteLine("DispatcherTimer_Click");
    }
    

    程序可以进入Tick事件。

    或者这样创建对象

    private static System.Windows.Threading.DispatcherTimer timer;
    
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        new System.Threading.Thread(CreateTimer).Start();
    }
    
    private void CreateTimer()
    {
        this.Dispatcher.Invoke(() => 
        {
            timer = new System.Windows.Threading.DispatcherTimer();
        });
        timer.Interval = TimeSpan.FromSeconds(1);
        timer.Tick += DispatcherTimer_Click;
        timer.Start();
    }
    
    private void DispatcherTimer_Click(object sender, EventArgs e)
    {
        Console.WriteLine("DispatcherTimer_Click");
    }
    

    原因如下

    DispatcherTimer.Tick 集成到按指定时间间隔和指定优先级处理的 Dispatcher 队列中的计时器。

    在线程中创建DispatcherTimer对象时,DispatcherTimer的Dispatcher是线程的Dispatcher。

    而此时如果线程如果没有操作UI对象,则其Dispatcher==null,详情见博客

  • 相关阅读:
    init: cannot execve(‘XXX’):Permission denied问题
    Android自己定义之流式布局
    GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)
    SICP 习题 (2.8) 解题总结:区间的减法
    Web
    this 与 super 反复问题?
    [Android&Java]浅谈设计模式-代码篇:观察者模式Observer
    053第170题
    SonarQube4.4+Jenkins进行代码检查实例之三-单元測试分析
    总结Codeigniter的一些优秀特性
  • 原文地址:https://www.cnblogs.com/njit-77/p/11468898.html
Copyright © 2011-2022 走看看