2

我正在开发 ac# windows 窗体 GUI 监控应用程序,它读取数据库表并发送 MAIL 和 SMS 警报。因此,为了监视数据库并发送邮件和 SMS,我使用了几秒钟后调用的 c# Timer,一旦发送和发送邮件,GUI 列表框将通过执行异步功能的后台工作人员进行更新。

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

但是如果需要这么长时间,定时器线程就会重叠并且异步函数会重叠。所以它会多次发送相同的邮件。如何解决?是因为 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 发送方法都使用了锁,但它不同步。

4

2 回答 2

1

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

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

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

于 2012-06-13T03:33:40.900 回答
0

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

于 2012-06-13T03:33:41.290 回答