如何同步定时器事件?

时间:2012-06-13 03:28:05

标签: c# multithreading timer synchronization

开发一个c#windows窗体GUI监控应用程序,它读取数据库表并发送MAIL和SMS警报。 所以为了监控数据库并发送邮件和短信我已经使用过几秒后调用的c#Timer, 一旦发送和发送邮件,GUI列表框将通过执行异步功能的后台工作程序进行更新。

在异步函数中,我获取数据库值并分离两个线程以发送邮件和短信。

但如果需要这么长时间,计时器线程就会重叠,异步功能会重叠。 所以它会多次发送Same Mail。怎么解决?它是否因为Timer重叠而发生?

t.Interval = cn.MtimeOut;
t.Enabled = true;
t.Tick += new System.EventHandler(OnTimerEvent);

OnTimerEvent实施

private void OnTimerEvent(object sender, EventArgs e)
{
    lock (_objLock)
    {
        this.startMonitor();
    }
}

private void startMonitor()
{
    MyList = new List<string>();
    var bw = new BackgroundWorker();
    bw.DoWork += (o, args) => asyncMonitor(); /* function which does sending
                                                 mail SMS and database reading*/

    bw.RunWorkerCompleted += (o, args) => UpdateControl();//update list box
    bw.RunWorkerAsync();
}

private void asyncMonitor()
{
    /* READ DATABASE TABLES AND DO CALCULATIONS 
       WHICH TAKES CONSIDERABLE AMOUNT OF TIME */

    // Thread for sending MAIL by execute MailLogEvent method
    Thread trd = new Thread(MailLogEvent); 

    // Thread for sending SMS by execute SmsLogEvent method
    Thread trd2 = new Thread(SmsLogEvent);

    //parameters for above functions
    trd2.Start(lg);
    trd.Start(lg);
}

我甚至使用了锁定Timer事件和SMS MAIL发送方法,但它没有同步。

2 个答案:

答案 0 :(得分:1)

几个月前,我做了类似的事情。

创建一个共享类,用于维护队列中的邮件并确保使用lock {}并保持队列中邮件的唯一性

所以,如果它需要花费太多时间并且计时器再次使用相同的邮件集合启动它会知道它存在于队列中并且不会再尝试发送它

答案 1 :(得分:0)

执行此操作的一种方法是将“锁定”添加到数据库。使用这种方法,您可以为要分派的每个SMS /邮件添加类似“status”的列。当计时器检索一行并将其排队等待发送时,它会将记录的状态更新为“待处理”或类似的状态。然后,当它实际调度消息时,它会将状态更新为“完成”。随后的重叠计时器调用将知道不处理处于“挂起”状态的记录。

相关问题