【问题标题】:How to Synchronize Timer Event?如何同步定时器事件?
【发布时间】:2012-06-13 03:28:05
【问题描述】:

我正在开发一个 c# windows 窗体 GUI 监控应用程序,它读取数据库表并发送 MAIL 和 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 发送方法都使用了锁,但它不同步。

【问题讨论】:

    标签: c# multithreading timer synchronization


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 这是我的选择之一,问题是,如果应用程序崩溃会发生什么?您需要将记录的状态从“待处理”重置为“未发送”,这并不困难,但它增加了让我们称之为“复杂性”的逻辑
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多