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函数入口设断点,发现程序无法进入。
如果这样创建对象
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,详情见博客
上一篇: Vue表单验证插件的制作过程