我正在开发一个c#windows窗体GUI监控应用程序,它读取数据库表并发送MAIL和SMS警报。 所以为了监控数据库和发送邮件和短信,我已经使用了几秒钟后调用的c#Timer, 一旦发送并发送邮件GUI列表框将通过执行异步功能的后台工作人员进行更新。如何同步计时器事件?
在异步函数中,我获取数据库值并分离出两个线程来发送Mail和SMS。
但是,如果它需要这么长时间,计时器线程重叠并且异步函数重叠。 所以它会多次发送同一邮件。如何解决这个问题?这是由于计时器重叠而发生的吗?
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);
}
我甚至已经用锁定时器事件和短信邮件发送方法,但它并不同步。
这是我的选择之一,它的问题是,如果应用程序崩溃会发生什么?你需要将记录的状态从“待处理”重置为“未发送”,这并不难,但它添加让我们把它称为逻辑的“复杂性” – Fredou