如何同步计时器事件

本文关键字:计时器 事件 同步 何同步 | 更新日期: 2023-09-27 18:37:02

我正在开发一个C#窗口形式的GUI监控应用程序,该应用程序读取数据库表并发送邮件和SMS警报。因此,为了监视数据库并发送邮件和短信,我使用了几秒钟后调用的c#计时器,发送和邮件发送后,GUI 列表框将通过执行异步功能的后台工作线程进行更新。

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

但是,如果花费这么长时间,计时器线程就会重叠,异步函数就会重叠。因此,它将多次发送相同的邮件。如何解决?这是由于计时器重叠而发生的吗?

t.Interval = cn.MtimeOut;
t.Enabled = true;
t.Tick += new System.EventHandler(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);
}

我什至对计时器事件和短信邮件发送方法使用了锁,但它不同步。

如何同步计时器事件

几个月

前我做了类似的事情。

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

因此,如果花费太多时间并且计时器再次使用同一组邮件触发,它将知道它存在于队列中并且不会尝试再次发送它

一种方法是将"锁"添加到数据库中。 使用这种方法,您将在要发送的每条短信/邮件中添加类似"状态"的列。 当计时器检索一行并将其排队等待发送时,它会将记录的状态更新为"挂起"或类似的东西。 然后,当它实际调度消息时,它会将状态更新为"完成"。 后续重叠的计时器调用将知道不处理处于"挂起"状态的记录。