WPF中定时器Timer与DispatcherTimer的用法
最近的工作项目中需要定时更新UI控件中的数据,这时候第一反应肯定会想到去使用System.Timers.Timer定时更新UI控件,但是程序运行后,会发现程序崩溃了。报的异常为“调用线程无法访问此对象,因为另一个线程拥有该对象。”,网上查找了原因,Timer的触发事件与UI不是属于同一个线程,所以说在Timer的触发事件去更新UI时,会造成UI对象被占用的问题。网上说,可以尝试用DispatcherTimer这个定时器去更新UI,于是我做个一个demo测试了一下,果然是可行的。
上面是一个WPF窗口,点击计时按钮,编辑框中显示计时次数
1.使用System.Timers.Timer更新编辑框中的数据
namespace Timer
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
System.Timers.Timer timer = null;
private static int nCount = ;
public MainWindow()
{
InitializeComponent();
timer = new System.Timers.Timer();
timer.AutoReset = true;
timer.Elapsed += new ElapsedEventHandler(TimeAction);
}
private void TimeAction(object sender, ElapsedEventArgs e)
{
if (!String.IsNullOrEmpty(txt_TimeCount.Text))
{
//计时次数大于10时,则关闭定时器
if (Convert.ToInt32(txt_TimeCount.Text) > )
{
timer.Stop();
}
} txt_TimeCount.Text = Convert.ToString(nCount++);
}
private void btn_Time_Click(object sender, RoutedEventArgs e)
{
timer.Start();
}
}
}
当点击按钮后,会很明显的出现上述所说的异常问题
2.使用DispatcherTimer更新编辑框中的数据
namespace Timer
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
DispatcherTimer dispatcherTimer = null;
private static int nCount = ;
public MainWindow()
{
InitializeComponent();
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Interval = new TimeSpan(, , );
dispatcherTimer.Tick += new EventHandler(TimeAction); } private void TimeAction(object sender, EventArgs e)
{
if (!String.IsNullOrEmpty(txt_TimeCount.Text))
{
//计时次数大于10时,则关闭定时器
if (Convert.ToInt32(txt_TimeCount.Text) > )
{
dispatcherTimer.Stop();
}
} txt_TimeCount.Text = Convert.ToString(nCount++);
}
private void btn_Time_Click(object sender, RoutedEventArgs e)
{
dispatcherTimer.Start();
}
}
}
输出结果如下,可以看出程序能够正常的运行
WPF中定时器Timer与DispatcherTimer的用法的更多相关文章
- WPF中定时器与进度条的配合使用
WPF中定时器使用的注意事项: WPF需要使用System.Windows.Threading.DispatcherTimer定时器,而不能使用System.Timers.Timer定时器.因为Sys ...
- Java中定时器Timer致命缺点(附学习方法)
简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人 ...
- WPF 中定时器的使用
DispatcherTimer timer; private void Window_Loaded(object sender, RoutedEventArgs e) { timer = new Di ...
- 解决windows 服务中定时器timer 定时偶尔失效 问题
最近做个windows 服务,功能是:定时执行一个任务:自动登录到一个网站后,点击相关网面上的按钮button. 在处理的过程中发现定时器老是不定时的失效,失效时间没有规律. 由于刚开始处于测试阶段, ...
- 【WPF】 Timer与 dispatcherTimer 在wpf中你应该用哪个?
源:Roboby 1.timer或重复生成timer事件,dispatchertimer是集成到队列中的一个时钟.2.dispatchertimer更适合在wpf中访问UI线程上的元素 3.Dispa ...
- wpf中应该使用c#四种定时器中的DispatcherTimer
c#中有四种定时器 1:System.Threading.Timer 使用: private System.Threading.Timer timerClose; timerClose = new S ...
- WPF中Timer与DispatcherTimer类的区别
前几天在WPF中写了一个轨迹回放的功能,我想稍微做过类似项目的,都晓得采用一个时间控件或者时间对象作为调度器,我在这么做的时候,出现了问题,于是将程序中的Timer换成了DispatchTimer,然 ...
- .NET中的Timer类型用法详解
这篇文章主要介绍了.NET中的Timer类型用法,较为详细的分析了Timer类型在各种环境下的用法,需要的朋友可以参考下 在.NET FrameWork中有多个Timer,那么怎么根据实际情况进行 ...
- WPF中timer的使用
Timer控件/ System.Timers.Timer 不能用于WPF中.在WPF中,定时器为 DispatcherTimer. 使用方法如下: private DispatcherTimer ti ...
随机推荐
- wangedit
<template> <el-row id="AddRoom"> <el-col :span="5">.</el-co ...
- FastJSON、Gson和Jackson性能对比
Java处理JSON数据有三个比较流行的类库FastJSON.Gson和Jackson.本文将测试这三个类库在JSON序列化和反序列化的方面表现,主要测试JSON序列化和反序列化的速度.为了防止由于内 ...
- PHP 缓存技术(一)
移除光盘
- Java时间api
- 【转】MFC内嵌cef3浏览器内核
一.cef3内核的下载 可以从http://opensource.spotify.com/cefbuilds/index.html下载,注意:很多版本编译都可以通过 但是运行的时候会崩溃,以cef_b ...
- Python:margin collapse
margin collapse:边界 折叠/重叠/坍塌 此种现象只会垂直方向并且要满足一定条件时才会出现这种现象. https://tech.youzan.com/css-margin-collaps ...
- Python:Day13
id() 查看内存地址 和while循环一样,在for循环中也可以使用break和continue,两者效果一样. repr
- windows下简单的缓冲区溢出
缓冲区溢出是什么? 当缓冲区边界限制不严格时,由于变量传入畸形数据或程序运行错误,导致缓冲区被“撑爆”,从而覆盖了相邻内存区域的数据 成功修改内存数据,可造成进程劫持,执行恶意代码,获取服务器控制权等 ...
- MemCache在.NET中使用Memcached.ClientLibrary详解 转发 https://www.cnblogs.com/li150dan/p/9529112.html
本文说明:memcached分布式缓存的负载均衡配置比例,数据压缩,socket的详细配置等,以及在.net中的常用方法 首先下载客户端的3个dll,ICSharpCode.SharpZipLib.d ...
- Spring Security(十四):5.4 Authorize Requests
Our examples have only required users to be authenticated and have done so for every URL in our appl ...