Im는 데이터베이스 테이블을 읽고 MAIL 및 SMS 경고를 보내는 GUI 모니터링 응용 프로그램을 C# Windows에서 개발합니다. 그래서 데이터베이스를 모니터링하고 메일과 SMS를 보내려면 몇 초 후에 호출되는 C# Timer를 사용했습니다. 일단 보내고 메일을 보내면 GUI 목록 상자가 비동기 함수를 실행하는 백그라운드 작업자를 통해 업데이트됩니다.타이머 이벤트를 동기화하는 방법?
비동기 함수에서 나는 데이터베이스 값을 얻고 Mail과 SMS를 보내기 위해 두개의 쓰레드를 스핀 오프한다.
하지만 너무 오래 걸리면 타이머 스레드가 랩 오버되고 비동기 함수가 오버랩됩니다. 그래서 여러 번 동일한 메일을 보냅니다. 어떻게 해결할 수 있습니까? 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);
}
나는 타이머 이벤트 및 방법을 보내는 SMS 메일, 심지어 사용하고 잠금하지만 동기화되지 않습니다.
내 옵션 중 하나였습니다. 문제는 응용 프로그램이 충돌하면 어떻게됩니까? 당신은 "pending"에서 "not sent"로 레코드의 상태를 리셋 할 필요가있다.하지만 그것은 어렵지 않다. – Fredou