gpt4 book ai didi

c# - 如何同步定时器事件?

转载 作者:太空宇宙 更新时间:2023-11-03 13:59:45 25 4
gpt4 key购买 nike

我正在开发一个 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# - 如何同步定时器事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11007827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com