内容摘要:

这是我在某个客户那边讲课的时候遇到一个小问题,在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(定时器)相关推荐

  1. jest.conf.js_如何在Jest中正确模拟Moment.js / dates

    jest.conf.js by Iain Nash 由伊恩·纳什(Iain Nash) 如何在Jest中正确模拟Moment.js / dates (How to correctly mock Mom ...

  2. 如何在R中正确使用列表?

    本文翻译自:How to Correctly Use Lists in R? Brief background: Many (most?) contemporary programming langu ...

  3. css中 media的用法,如何在css中正确使用@media

    如何在css中使用@media作为特定分辨率?所以我想让我的侧栏更改取决于用户分辨率,所以我使用@media.如何在css中正确使用@media 这是示例代码: @media (max-width: ...

  4. java 中覆 写tostring_如何在Java中正确覆盖toString()?

    如何在Java中正确覆盖toString()? 听起来有点愚蠢,但我需要帮助我的toString()方法,这是非常irking. 我尝试在网上查找,因为toString是搞砸了,"没有找到K ...

  5. MySQL中使用CASE出错,如何在MySQL中正确使用CASE..WHEN

    如何在MySQL中正确使用CASE..WHEN 这里是一个演示查询,注意它非常简单,仅在base_price为0的位置获取,并且仍然select条件3: SELECT CASE course_enro ...

  6. python异步加载图片_如何在PyQt5中正确异步加载图像?

    我在尝试如何在pyqtqlistview中正确地完成异步映像加载.在 我的主小部件由一个Qlistview和一个QLineEdit文本框组成. 我有一个参与者数据库,我使用QAbstractListM ...

  7. scarpy框架如何在crawl中正确传递自定义参数,scrapy.cmdline的execute为什么不能在while True中无限循环,execute换成crawl 方法

    问题:scrapy.cmdline的execute函数执行完毕为什么一定会停,不能执行后面函数,也不在while True中无限循环(解决问题的结果 在最后) 我想让scrapy程序全年无休止运行,2 ...

  8. 如何在 Java 中正确使用 wait, notify 和 notifyAll – 以生产者消费者模型为例

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. wait, notify 和 noti ...

  9. java 解析数据包_java - 如何在Java中正确解析TCP数据包? - 堆栈内存溢出

    我目前有一个简单的TCP服务器,该服务器调用一个函数,并在每个新的传入数据包上以字节数组的形式将二进制TCP有效负载传递给它,解析它的正确方法是什么? 我试图通过将其切成不同的字节数组并分别进行处理来 ...

最新文章

  1. CNN更新换代!性能提升算力减半,还即插即用(附论文)
  2. nbalive05 editor 正式版
  3. Fibonacii数列,兔子问题
  4. 直播预告丨挖掘客户生命周期价值,寻迹券商业务增长
  5. 知识梳理——CSS篇
  6. intellij运行多个工程
  7. Sales Volume Analysis PoC app test - environment setup finished
  8. nssl1477-赛【对顶堆,贪心】
  9. 分享一套C++入门基础视频
  10. 多元高斯分布是非参_(二)多元高斯分布与概率图条件独立性假设
  11. 数据表 高水位 mysql_Oracle中的高水位(HWM)
  12. python加减乘除计算器 eval_Python计算器(模拟eval)
  13. 【机器人学】机器人动力学参数辨识方法综述
  14. Java经典全套面试汇总(二十万字)
  15. api zoom 实现自动预定_一种基于Web端API的网络地图图片自动截取拼接的方法与流程...
  16. 自然语言处理实战——巧用 Amazon Comprehend 分析社交媒体数据
  17. 小菊的语义分割1——语义分割科普Semantic Segmentation
  18. js中创建桌面网页快捷方式代码
  19. .NET高级软件工程师的面试题目
  20. 使用Jmeter进行接口测试和压力测试的配置和使用

热门文章

  1. 嘉兴 机器人仓库 菜鸟_“199”机器人火了,天猫双11,有1亿人次“云监工”物流发货...
  2. virtualbox使用手记
  3. 基于html5 Canvas图表库 : ECharts
  4. 给 QtCtreator 工程文件 pro 配置 pthread库和liburcu库
  5. 易混单词 expect VS except
  6. GDAL不支持创建PCIDSK的面状矢量格式
  7. gradle——eclipse中安装与web项目创建
  8. 更改shape文件字段名,提示Failed to alter the name of the field
  9. WebStorm 自定义字体+颜色+语法高亮+导入导出用户设置
  10. JS--对象的特性之一---继承性