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,详情见博客
您可能感兴趣的文章:
如您对本文有疑问或者有任何想说的,请 点击进行留言回复,万千网友为您解惑!
网友评论