如何在ViewModel中正确地使用Timer(定时器)
内容摘要:
这是我在某个客户那边讲课的时候遇到一个小问题,在ViewModel中创建的一个Timer,并不会被自动停止,即便使用该ViewModel的View已经被关闭了。这个问题的原因在于Timer的特殊工作机制,它是运行在一个独立的工作线程的,除非明确地停止他,或者整个程序关闭了,它才会停止。这一讲中,我通过实例重现了这个问题,然后提供了一个可行的解决方法。
视频地址:
http://www.tudou.com/programs/view/uO4b2j0N4L8/
示例代码:
备注:该范例使用了MvvmLight作为MVVM框架,请自行安装
Model:
using System;
using System.Diagnostics;
using System.Linq;namespace SilverlightApplicationSample
{public class DataService{public static Customer[] GetCustomers(){Debug.WriteLine(string.Format("[{0}]正在调用数据服务",DateTime.Now));var rnd = new Random();return Enumerable.Range(1, rnd.Next(100)).Select(x => new Customer(){CompanyName = "Company " + x.ToString()}).ToArray();}}public class Customer{public string CompanyName { get; set; }}
}
using System;
using System.Windows.Threading;
using GalaSoft.MvvmLight;namespace SilverlightApplicationSample
{/// <summary>/// 使用MVVMLight实现的MVVM ViewModel/// </summary>public class CustomerWindowViewModel : ViewModelBase{/// <summary>/// 这个方法也不会自动调用/// </summary>public override void Cleanup(){base.Cleanup();timer.Stop();}DispatcherTimer timer = null;public CustomerWindowViewModel(){//正常情况下的绑定//Customers = DataService.GetCustomers();//使用定时器调用服务timer = new DispatcherTimer();timer.Interval = TimeSpan.FromSeconds(1);timer.Tick += (o, a) =>{Customers = DataService.GetCustomers();};timer.Start();}private Customer[] _Customers;public Customer[] Customers{get { return _Customers; }set{if (_Customers != value){_Customers = value;RaisePropertyChanged("Customers");}}}}
}
View:
<controls:ChildWindow x:Class="SilverlightApplicationSample.CustomerWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls"Width="400"Height="300"Title="CustomerWindow"xmlns:local="clr-namespace:SilverlightApplicationSample"><controls:ChildWindow.DataContext><local:CustomerWindowViewModel></local:CustomerWindowViewModel></controls:ChildWindow.DataContext><Grid x:Name="LayoutRoot"Margin="2"><Grid.RowDefinitions><RowDefinition /><RowDefinition Height="Auto" /></Grid.RowDefinitions><ListBox ItemsSource="{Binding Customers}"DisplayMemberPath="CompanyName"></ListBox><Button x:Name="CancelButton"Content="Cancel"Click="CancelButton_Click"Width="75"Height="23"HorizontalAlignment="Right"Margin="0,12,0,0"Grid.Row="1" /><Button x:Name="OKButton"Content="OK"Click="OKButton_Click"Width="75"Height="23"HorizontalAlignment="Right"Margin="0,12,79,0"Grid.Row="1" /></Grid>
</controls:ChildWindow>
Page:
using System.Windows;
using System.Windows.Controls;namespace SilverlightApplicationSample
{public partial class MainPage : UserControl{public MainPage(){InitializeComponent();}private void Button_Click(object sender, RoutedEventArgs e){var window = new CustomerWindow();window.Closed += (o, a) =>{var vm = window.DataContext as CustomerWindowViewModel;vm.Cleanup();};window.Show();}}
}
转载于:https://www.cnblogs.com/chenxizhang/archive/2012/05/05/2484637.html
如何在ViewModel中正确地使用Timer(定时器)相关推荐
- jest.conf.js_如何在Jest中正确模拟Moment.js / dates
jest.conf.js by Iain Nash 由伊恩·纳什(Iain Nash) 如何在Jest中正确模拟Moment.js / dates (How to correctly mock Mom ...
- 如何在R中正确使用列表?
本文翻译自:How to Correctly Use Lists in R? Brief background: Many (most?) contemporary programming langu ...
- css中 media的用法,如何在css中正确使用@media
如何在css中使用@media作为特定分辨率?所以我想让我的侧栏更改取决于用户分辨率,所以我使用@media.如何在css中正确使用@media 这是示例代码: @media (max-width: ...
- java 中覆 写tostring_如何在Java中正确覆盖toString()?
如何在Java中正确覆盖toString()? 听起来有点愚蠢,但我需要帮助我的toString()方法,这是非常irking. 我尝试在网上查找,因为toString是搞砸了,"没有找到K ...
- MySQL中使用CASE出错,如何在MySQL中正确使用CASE..WHEN
如何在MySQL中正确使用CASE..WHEN 这里是一个演示查询,注意它非常简单,仅在base_price为0的位置获取,并且仍然select条件3: SELECT CASE course_enro ...
- python异步加载图片_如何在PyQt5中正确异步加载图像?
我在尝试如何在pyqtqlistview中正确地完成异步映像加载.在 我的主小部件由一个Qlistview和一个QLineEdit文本框组成. 我有一个参与者数据库,我使用QAbstractListM ...
- scarpy框架如何在crawl中正确传递自定义参数,scrapy.cmdline的execute为什么不能在while True中无限循环,execute换成crawl 方法
问题:scrapy.cmdline的execute函数执行完毕为什么一定会停,不能执行后面函数,也不在while True中无限循环(解决问题的结果 在最后) 我想让scrapy程序全年无休止运行,2 ...
- 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. wait, notify 和 noti ...
- java 解析数据包_java - 如何在Java中正确解析TCP数据包? - 堆栈内存溢出
我目前有一个简单的TCP服务器,该服务器调用一个函数,并在每个新的传入数据包上以字节数组的形式将二进制TCP有效负载传递给它,解析它的正确方法是什么? 我试图通过将其切成不同的字节数组并分别进行处理来 ...
最新文章
- CNN更新换代!性能提升算力减半,还即插即用(附论文)
- nbalive05 editor 正式版
- Fibonacii数列,兔子问题
- 直播预告丨挖掘客户生命周期价值,寻迹券商业务增长
- 知识梳理——CSS篇
- intellij运行多个工程
- Sales Volume Analysis PoC app test - environment setup finished
- nssl1477-赛【对顶堆,贪心】
- 分享一套C++入门基础视频
- 多元高斯分布是非参_(二)多元高斯分布与概率图条件独立性假设
- 数据表 高水位 mysql_Oracle中的高水位(HWM)
- python加减乘除计算器 eval_Python计算器(模拟eval)
- 【机器人学】机器人动力学参数辨识方法综述
- Java经典全套面试汇总(二十万字)
- api zoom 实现自动预定_一种基于Web端API的网络地图图片自动截取拼接的方法与流程...
- 自然语言处理实战——巧用 Amazon Comprehend 分析社交媒体数据
- 小菊的语义分割1——语义分割科普Semantic Segmentation
- js中创建桌面网页快捷方式代码
- .NET高级软件工程师的面试题目
- 使用Jmeter进行接口测试和压力测试的配置和使用
热门文章
- 嘉兴 机器人仓库 菜鸟_“199”机器人火了,天猫双11,有1亿人次“云监工”物流发货...
- virtualbox使用手记
- 基于html5 Canvas图表库 : ECharts
- 给 QtCtreator 工程文件 pro 配置 pthread库和liburcu库
- 易混单词 expect VS except
- GDAL不支持创建PCIDSK的面状矢量格式
- gradle——eclipse中安装与web项目创建
- 更改shape文件字段名,提示Failed to alter the name of the field
- WebStorm 自定义字体+颜色+语法高亮+导入导出用户设置
- JS--对象的特性之一---继承性