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函数入口设断点,发现程序无法进入。

1773352-20190905183659513-729598169.png

如果这样创建对象

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事件。

1773352-20190905183715352-1329255005.png

或者这样创建对象

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,详情见博客

转载于:https://www.cnblogs.com/njit-77/p/11468898.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值