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

最新文章

  1. Unity3D移动平台动态读取外部文件全解析
  2. PostgreSQL中标准的SQL boolean数据类型
  3. [LoadRunner]录制启动时报“The JVM could not be started……”错误解决方案
  4. [terry笔记]RMAN综合学习之备份
  5. 使用jQuery.FileUpload和Backload自定义控制器上传多个文件
  6. Qt Add ons Modules(听说QtSystem有接口可以获取 imei号)
  7. 虚拟机修改静态ip
  8. 七牛php-sdk使用-文档处理
  9. JSP错误页面的处理和exception对象
  10. 【C++笔记】析构函数(destructor)
  11. Intel_AV-ICE06加速卡+QAT_Engine测试
  12. 微信小程序实战[01]
  13. keyvalue对RDD s
  14. 第 16 章 C 预处理器和 C 库(string.h 库中的 memcpy() 和 memmove())
  15. php利用自定义key,对数据加解密的方法
  16. JavaScript中函数的继承
  17. mysql手动设置数据表的自增值
  18. git push remote: User permission denied
  19. AtCoder ARC 090 E / AtCoder 3883: Avoiding Collision
  20. centos 7 上配置mysql 开机启动详解

热门文章

  1. 如何只修改EFLAGS寄存器中一个标志位的值?
  2. vue国际化问题i18n为null
  3. idea把菜单栏给点没了...(File、Edit、View、Navigate.......)
  4. linux 进程通信之 mmap
  5. I2C 挂死,SDA一直为低问题分析【转】
  6. Jquery ajax 同步阻塞引起的UI线程阻塞的坑(loading图片显示不出来,layer.load延迟)
  7. 201871010126 王亚涛 《面向对象程序设计(Java)》第七周实验总结
  8. 01-人脸识别-基于MTCNN,框选人脸区域-detect_face_main
  9. Eclipse的server选项卡中找不到tomcat配置项
  10. LeetCode24-Swap_Pairs