背景:
最近在做一个项目,程序是命令行程序,在主程序中开一个线程,这个线程用到了System.Timer类的Elapsed事件,根据指定时间间隔循环去查询数据库,找符合条件的记录,把记录组织成xml对象发送到MSMQ中去。刚一开始的时候数据量小,在时间间隔内可以查询所有的记录并发送到MSMQ,随着业务量大增大,在时间间隔内会多次执行查询数据库发送MSMQ,这样就会产生重复的数据发送到MSMQ了。所以本次在System.Timer类的Elapsed事件中加锁,使上次任务执行完之前,后面的任务无法执行。

程序代码:

    public class ThreadSendMQ
{
public void Work(object th)
{
string str = "消息队列发送模式:多线程发送模式。";
Console.WriteLine(str); System.Timers.Timer t = new System.Timers.Timer();
t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
t.Interval = * Convert.ToInt16(ConfigManager.SleepTime);
t.Enabled = true;
} void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//加锁检查数据库和发送MSMQ
lock (this)
{
send();
}
} private void send()
{
string str = "线程正在发送消息队列";
//线程查询数据库并发送到MSMQ中去。
//Console.Write(str);
//LogManager.WriteFilerLog(ConfigManager.LogPath, str);
}
} /////// 主程序 //////////////
class Program
{
static void Main(string[] args)
{
ThreadSendMQ thSend = new ThreadSendMQ();
System.Threading.ParameterizedThreadStart thrParm = new System.Threading.ParameterizedThreadStart(thSend.Work);
System.Threading.Thread thread = new System.Threading.Thread(thrParm);
thread.Start(System.Threading.Thread.CurrentThread);
}
}

经过上面的锁,就可以防止任务的多次执行,当前项目的bug完美解决。

给System.Timer类的Elapsed事件加锁的更多相关文章

  1. C#中timer类的用法

    C#中timer类的用法 关于C#中timer类  在C#里关于定时器类就有3个   1.定义在System.Windows.Forms里   2.定义在System.Threading.Timer类 ...

  2. 使用System.Timers.Timer类实现程序定时执行

    使用System.Timers.Timer类实现程序定时执行 在C#里关于定时器类有3个:System.Windows.Forms.Timer类.System.Threading.Timer类和Sys ...

  3. 定时器:Timer:System.Threading.Timer类(转)

    最近的一个项目有一些地方需要用到定时功能,在设计过程中,突然发现.net的Timer类居然还有很多我以前没有用过的功能,这里就跟大家分享一下 注:这里的Timer类特指System.Threading ...

  4. C#的timer类

    在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Timers.Timer类里 S ...

  5. 关于C#中timer类

    ·关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Tim ...

  6. 使用timer定时器,防止事件重入

    首先简单介绍一下timer,这里所说的timer是指的System.Timers.timer,顾名思义,就是可以在指定的间隔是引发事件.官方介绍在这里,摘抄如下: 1 2 Timer 组件是基于服务器 ...

  7. Timer类的常见使用方法

    System.Timers名称空间中的Timer类的构造函数只需要一个时间间隔,经过该时间间隔后应该调用的方法用Elapsed事件指定,这个事件需要一个ElapsedEventHandler类型的委托 ...

  8. java swing中Timer类的学习

    最近在完成学校课程的java平时作业,要实现一个计时器,包含开始.暂停以及重置三个功能.由于老师规定要用这个timer类,也就去学习了一下,顺便记录一下. 首先呢去查了一下java手册上的东西,发现t ...

  9. 适配器、工厂模式、线程池、线程组、互斥锁、Timer类、Runtime类、单例设计模式(二十四)

    1.多线程方法 * Thread 里面的俩个方法* 1.yield让出CPU,又称为礼让线程* 2.setPriority()设置线程的优先级 * 优先级最大是10,Thread.MAX_PRIORI ...

随机推荐

  1. Linux系统下chkconfig命令使用详解

    chkconfig命令可以用来检查.设置系统的各种服务 使用语法:chkconfig [--add][--del][--list][系统服务] 或 chkconfig [--level <等级代 ...

  2. hydra简单使用示例

    本内容为网上收集整理,仅作为备忘!! hydra简单使用示例: 破解https: # hydra -m /index.php -l muts -P pass.txt 10.36.16.18 https ...

  3. java分页的实现(后台工具类和前台jsp页面)

    1.首先,新建一个类Page.java public class Page implements Serializable { private static final long serialVers ...

  4. nagios报错Error: No such CGI app - /usr/local/nagios/sbin/nagios/cgi-bin/status.cgi may not exist or is not executable by this process.

    加上rewrite rewrite ^/nagios/cgi-bin/(.*)\.cgi /$.cgi break;  

  5. virtio guest side implementation: PCI, virtio device, virtio net and virtqueue

    With the publishing of OASIS virtio specification version 1.0, virtio made another big step in becom ...

  6. es6 中的let,const

    在es6中,let的作用和var差不多,都是用来声明变量的,但是他们之间的区别在于作用域不同,大家都知道在js中没有块级作用域,例如: for(var i=0;i<10;i++){ consol ...

  7. spring: spittr实例 构建简单的web应用 Test测试用例

    本例为Test,测试上一贴的程序 package spittr.web; import org.junit.Test; import org.springframework.test.web.serv ...

  8. python线程、进程和协程

    链接:http://www.jb51.net/article/88825.htm 引言 解释器环境:python3.5.1 我们都知道python网络编程的两大必学模块socket和socketser ...

  9. kindeditor上传本地图片实例

    所需插件:kindeditor下载   密码: 5ry4 jsp文件: <script type="text/javascript" language="javas ...

  10. PhpStorm怎么用,PhpStorm常用快捷键教程

    设置快捷键:File -> Settings -> IDE Settings -> Keymap -> 选择“Eclipse” -> 然后“Copy”一份 ->再个 ...