データベース テーブルを読み取り、MAIL および SMS アラートを送信する ac# Windows フォーム GUI 監視アプリケーションを開発しています。したがって、データベースを監視し、メールと SMS を送信するために、数秒後に呼び出される c# タイマーを使用しました。送信とメールが送信されると、非同期関数を実行するバックグラウンド ワーカーによって GUI リスト ボックスが更新されます。
非同期関数では、データベースの値を取得し、2 つのスレッドをスピンオフしてメールと 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);
}
Timer イベントや SMS MAIL の送信メソッドにも lock を使用しましたが、同期しません。