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

WPF DispatcherTimer一些个人看法 (原发布 csdn 2017-04-25 19:12:22)

程序员文章站 2023-11-09 16:59:58
wpf中的DispatcherTimer基本用法,本文不在叙述。主要写一些不同的,来提醒自己不要再犯同样错误。 前几天写代码时发现。当在非UI线程创建DispatcherTimer实例时,程序无法进入Tick事件 在DispatcherTimer_Click函数入口设断点,发现程序无法进入。 如果这 ......

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

WPF  DispatcherTimer一些个人看法 (原发布 csdn 2017-04-25 19:12:22)

如果这样创建对象

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

WPF  DispatcherTimer一些个人看法 (原发布 csdn 2017-04-25 19:12:22)

或者这样创建对象

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