WPF DispatcherTimer一些个人看法 (原发布 csdn 2017-04-25 19:12:22)
2024-09-02 01:52: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函数入口设断点,发现程序无法进入。
如果这样创建对象
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,详情见博客
最新文章
- Unity3D移动平台动态读取外部文件全解析
- PostgreSQL中标准的SQL boolean数据类型
- [LoadRunner]录制启动时报“The JVM could not be started……”错误解决方案
- [terry笔记]RMAN综合学习之备份
- 使用jQuery.FileUpload和Backload自定义控制器上传多个文件
- Qt Add ons Modules(听说QtSystem有接口可以获取 imei号)
- 虚拟机修改静态ip
- 七牛php-sdk使用-文档处理
- JSP错误页面的处理和exception对象
- 【C++笔记】析构函数(destructor)
- Intel_AV-ICE06加速卡+QAT_Engine测试
- 微信小程序实战[01]
- keyvalue对RDD s
- 第 16 章 C 预处理器和 C 库(string.h 库中的 memcpy() 和 memmove())
- php利用自定义key,对数据加解密的方法
- JavaScript中函数的继承
- mysql手动设置数据表的自增值
- git push remote: User permission denied
- AtCoder ARC 090 E / AtCoder 3883: Avoiding Collision
- centos 7 上配置mysql 开机启动详解
热门文章
- 如何只修改EFLAGS寄存器中一个标志位的值?
- vue国际化问题i18n为null
- idea把菜单栏给点没了...(File、Edit、View、Navigate.......)
- linux 进程通信之 mmap
- I2C 挂死,SDA一直为低问题分析【转】
- Jquery ajax 同步阻塞引起的UI线程阻塞的坑(loading图片显示不出来,layer.load延迟)
- 201871010126 王亚涛 《面向对象程序设计(Java)》第七周实验总结
- 01-人脸识别-基于MTCNN,框选人脸区域-detect_face_main
- Eclipse的server选项卡中找不到tomcat配置项
- LeetCode24-Swap_Pairs