c# timer 销毁_如果表单应用程序关闭C#,如何防止发生Timer Elapsed事件
我在
Windows窗体应用程序(Visual C#)中有一个计时器,当我想退出应用程序时,它会导致问题.
计时器被定义为表单类的成员:
partial class Form1
{
//These are the members in question:
internal ComACRServerLib.Channel channel;
private System.Timers.Timer updateStuff;
}
在表单应用程序的构造函数中声明/构造计时器:
public Form1()
{
InitializeComponent();
updateStuff = new System.Timers.Timer();
updateStuff.Elapsed += new System.Timers.ElapsedEventHandler(updateStuff_Elapsed);
}
只需按一下按钮即可启动和配置计时器:
private void btnAcquire_Click(object sender, EventArgs e)
{
updateStuff.Interval = 100;
updateStuff.Enabled = true;
updateStuff.AutoReset = true;
updateStuff.Start();
}
当计时器过去时,它调用updateStuff_Elapsed,它获取要用setText显示的信息(有一些代码可以确保调用setText是线程安全的).
private void updateStuff_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if (!channel.isOffline)
{
object[] status = channel.GetACRCustom("P6144");
setText(System.Convert.ToString(status[0]));
}
}
public delegate void setTextDelegate(string text);
public void setText(string text)
{
if (this.lblTest.InvokeRequired == true)
{
setTextDelegate d = new setTextDelegate(setText);
this.Invoke(d, new object[] { text });
}
else
{
lblTest.Text = text;
}
}
在应用程序退出时,我尝试摆脱计时器,并使用以下内容阻止它再次触发:
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
updateStuff.AutoReset = false;
updateStuff.Stop();
updateStuff.Close();
updateStuff.Dispose();
components.Dispose();
}
base.Dispose(disposing);
}
但是如果计时器是自动运行的并且我退出程序,我总是得到错误,Timer Elapsed事件调用的例程updateStuff_elapsedis试图使用已经处理过的资源!即使我已经尽力停止并在处理之前销毁计时器.
当应用程序关闭时,如何停止计时器的触发?
编辑
我尝试移动Dispose代码以试图强制关闭计时器,但没有运气.我还尝试使用updateStuff.Elapsed – = updateStuff_Elapsed在停止和处理之前删除事件调用;
protected override void Dispose(bool disposing)
{
//now this code HAS to run always.
updateStuff.Elapsed -= updateStuff_Elapsed;
updateStuff.AutoReset = false;
updateStuff.Stop();
updateStuff.Close();
updateStuff.Dispose();
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
最佳答案 如
System.Timers.Timer的文档中所述,Timer的事件处理程序调用在ThreadPool线程上排队.因此,您必须假设事件处理程序可以一次调用多次,或者可以在禁用Timer后调用.因此,事件处理程序必须设计为正确处理这些情况.
首先,将timer的SynchronizingObject属性设置为Form的实例.这将把所有事件处理程序的调用编组到UI线程,因此我们不需要打扰表单字段的锁定(我们将始终从同一个UI线程访问所有内容).使用此属性集,您也不需要在setText方法中调用this.Invoke(…).
public Form1()
{
updateStuff = new System.Timers.Timer();
updateStuff.SynchronizingObject = this;
...
}
public void setText(string text)
{
lblTest.Text = text;
}
然后创建标志,让你知道,计时器是否被处置.然后只需在事件处理程序中检查此标志:
partial class Form1
{
private bool Disposed;
....
}
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
updateStuff.Dispose();
Disposed = true;
}
base.Dispose(disposing);
}
private void updateStuff_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if(!Disposed)
{
if (!channel.isOffline)
{
object[] status = channel.GetACRCustom("P6144");
setText(System.Convert.ToString(status[0]));
}
}
}
c# timer 销毁_如果表单应用程序关闭C#,如何防止发生Timer Elapsed事件相关推荐
- 使用万能表单解析程序将表单数据封装成ListMap
在JadePool中,提供了一个 万能表单解析类ProcessForm,目的是提供对ProcessVO实现插入或更新记录的支持. 它能将任意复杂的表单记录,包括所有的字段,包括单记录和多记录,解析并封 ...
- python表单防重复提交_防止表单重复提交的几种策略
表单重复提交是在多用户Web应用中最常见.带来很多麻烦的一个问题.有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次. 点击刷新按钮. 使用浏览器后退按钮重复之前的操作,导致重复提交表单. ...
- java防止表单二次提交_防止表单重复提交
在Web开发中表单的重复提交是很严重的问题,重复提交成功会产生垃圾数据消耗不必要的资源,更严重的是如果遇到恶意刷库的情况垃圾数据更是数不胜数.在正常使用过程中产生重复提交的情况也有多重情况:鼠标连击. ...
- jsf表单验证_动态表单,JSF世界期待已久
jsf表单验证 新的PrimeFaces扩展版本0.5.0带来了新的DynaForm组件. 通常,如果知道行/列的数量,元素的位置等,则可以通过h:panelGrid或p:panelGrid构建非常简 ...
- 什么标签用于在表单中构建复选框_基础表单标签及属性
表单标签 一.一个完整的表单包含三个基本组成部分:(表单标签.表单域.表单按钮) 1.表单标签:form标签,用于设置服务器地址.请求方式等等 2.表单域:用户需要填写或选择的数据,输入框.单 ...
- mysql动态表单设计与实现_动态表单的数据库结构设计
利用在线编辑器设计的表单,包含输入框,明细表(动态添加行)等需要存储到数据库的信息,现在有三种思路: 1.一个表单对应数据库的一张或多张物理表(主从表),这种设计在很多业务的情况下,其数据库的物理表会 ...
- java自定义表单系统_自定义表单二次开发
自定义表单二次开发 === 自定义表单的页面和业务逻辑增强采用JS增强和Java增强实现.![输入图片说明](https://static.oschina.net/uploads/img/201804 ...
- java 文本域不可编辑_实现表单input文本框不可编辑的三种方法
问题 有时,我们需要以不可编辑的模式显示表单域,那么如何实现?我们可以通过为表单字段(input文本框,标签,复选框,文本区域)设置以下方法来实现表单的不可编辑功能. 实现方式 1.οnfοcus=t ...
- springboot 订单重复提交_防止表单重复提交(springboot,redis)
我们在web项目中经常需要在后台对用户提交的表单进行校验防止重复提交.下面通过springboot的aop.redis来解决表单重复提交的问题. 通过在controller加上CheckSubmitF ...
最新文章
- 鲜为人知的C++ IO fstream流
- IT草根的江湖之路之六:曙光,第一次破例
- 成功解决SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position 6-7: malformed
- href 一个正则表达式的解析 ? 号解析
- 记一篇矫正牙齿、蛀牙(烂牙)。从小保护牙齿_(六龄齿封窝)
- 执行pip安装的程序:command not found
- WCF远程服务器返回了意外响应: (413) Request Entity Too Large问题处理
- Vss2005局域网开发权限设置指南
- 计算机主机名在哪里看win7,大师教您win7系统查看win7系统电脑主机名的图文步骤...
- mysql中locate和substring函数使用
- NXP与STM32单片机程序架构
- python丨Scrapy框架案例二:阳光问政平台
- Qt中打包程序运行时出现:0xc000007b错误
- 深入浅出SpringCloud
- Kindle资源-史上最全60GB的Kindle电子书资源网盘打包下载
- linux 路径 别名,如何创建路径别名
- 自动驾驶专题介绍 ———— 转向系统
- 数据结构-队列-“先进先出”的数据结构
- 【系统架构设计师】第四章 计算机网络
- zuk如将手机更新到Android10,ZUI新升级:ZUK宣布支持全机型升级Android N系统