我在

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事件相关推荐

  1. 使用万能表单解析程序将表单数据封装成ListMap

    在JadePool中,提供了一个 万能表单解析类ProcessForm,目的是提供对ProcessVO实现插入或更新记录的支持. 它能将任意复杂的表单记录,包括所有的字段,包括单记录和多记录,解析并封 ...

  2. python表单防重复提交_防止表单重复提交的几种策略

    表单重复提交是在多用户Web应用中最常见.带来很多麻烦的一个问题.有很多的应用场景都会遇到重复提交问题,比如: 点击提交按钮两次. 点击刷新按钮. 使用浏览器后退按钮重复之前的操作,导致重复提交表单. ...

  3. java防止表单二次提交_防止表单重复提交

    在Web开发中表单的重复提交是很严重的问题,重复提交成功会产生垃圾数据消耗不必要的资源,更严重的是如果遇到恶意刷库的情况垃圾数据更是数不胜数.在正常使用过程中产生重复提交的情况也有多重情况:鼠标连击. ...

  4. jsf表单验证_动态表单,JSF世界期待已久

    jsf表单验证 新的PrimeFaces扩展版本0.5.0带来了新的DynaForm组件. 通常,如果知道行/列的数量,元素的位置等,则可以通过h:panelGrid或p:panelGrid构建非常简 ...

  5. 什么标签用于在表单中构建复选框_基础表单标签及属性

    表单标签 一.一个完整的表单包含三个基本组成部分:(表单标签.表单域.表单按钮) ​ 1.表单标签:form标签,用于设置服务器地址.请求方式等等 ​ 2.表单域:用户需要填写或选择的数据,输入框.单 ...

  6. mysql动态表单设计与实现_动态表单的数据库结构设计

    利用在线编辑器设计的表单,包含输入框,明细表(动态添加行)等需要存储到数据库的信息,现在有三种思路: 1.一个表单对应数据库的一张或多张物理表(主从表),这种设计在很多业务的情况下,其数据库的物理表会 ...

  7. java自定义表单系统_自定义表单二次开发

    自定义表单二次开发 === 自定义表单的页面和业务逻辑增强采用JS增强和Java增强实现.![输入图片说明](https://static.oschina.net/uploads/img/201804 ...

  8. java 文本域不可编辑_实现表单input文本框不可编辑的三种方法

    问题 有时,我们需要以不可编辑的模式显示表单域,那么如何实现?我们可以通过为表单字段(input文本框,标签,复选框,文本区域)设置以下方法来实现表单的不可编辑功能. 实现方式 1.οnfοcus=t ...

  9. springboot 订单重复提交_防止表单重复提交(springboot,redis)

    我们在web项目中经常需要在后台对用户提交的表单进行校验防止重复提交.下面通过springboot的aop.redis来解决表单重复提交的问题. 通过在controller加上CheckSubmitF ...

最新文章

  1. 鲜为人知的C++ IO fstream流
  2. IT草根的江湖之路之六:曙光,第一次破例
  3. 成功解决SyntaxError: (unicode error) ‘unicodeescape‘ codec can‘t decode bytes in position 6-7: malformed
  4. href 一个正则表达式的解析 ? 号解析
  5. 记一篇矫正牙齿、蛀牙(烂牙)。从小保护牙齿_(六龄齿封窝)
  6. 执行pip安装的程序:command not found
  7. WCF远程服务器返回了意外响应: (413) Request Entity Too Large问题处理
  8. Vss2005局域网开发权限设置指南
  9. 计算机主机名在哪里看win7,大师教您win7系统查看win7系统电脑主机名的图文步骤...
  10. mysql中locate和substring函数使用
  11. NXP与STM32单片机程序架构
  12. python丨Scrapy框架案例二:阳光问政平台
  13. Qt中打包程序运行时出现:0xc000007b错误
  14. 深入浅出SpringCloud
  15. Kindle资源-史上最全60GB的Kindle电子书资源网盘打包下载
  16. linux 路径 别名,如何创建路径别名
  17. 自动驾驶专题介绍 ———— 转向系统
  18. 数据结构-队列-“先进先出”的数据结构
  19. 【系统架构设计师】第四章 计算机网络
  20. zuk如将手机更新到Android10,ZUI新升级:ZUK宣布支持全机型升级Android N系统

热门文章

  1. linux内核地址映射,Linux内核设备驱动地址映射笔记整理
  2. mxnet 查看中间层结果
  3. Code128条形码
  4. app:compileDebugJavaWithJavac
  5. python编码格式
  6. AsyncHttpServer 异步回调,并发
  7. pytorch加载预训练 加载部分参数
  8. Python监控目录和文件变化
  9. Python操作MySQL之SQLAlchemy
  10. PyTorch学习笔记(二)——回归