2012-06-13 2 views
2

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 메일, 심지어 사용하고 잠금하지만 동기화되지 않습니다.

답변

1

나는 몇 달 전에 비슷한 일을했습니다.

는 대기열에있는 메일을 유지 공유 클래스를 만들고 잠금을 {} 사용 있는지 확인하고 너무 많은 시간과 타이머 GET을 가지고가는 경우에 당신은

때문에 대기열에있는 메일의 고유성을 유지 동일한 메일 세트를 사용하여 다시 실행하십시오. 대기열에 있음을 알게되고 다시 보내지 않습니다.

0

"잠금"을 데이터베이스에 추가하는 한 가지 방법이 있습니다. 이 방법을 사용하면 발송할 각 SMS/메일에 "상태"와 같은 열을 추가 할 수 있습니다. 타이머가 행을 검색하고 전송 대기열을 만들면 레코드의 상태가 "보류 중"으로 변경됩니다. 그런 다음 실제로 메시지를 보내면 상태가 "완료"로 업데이트됩니다. 연속 된 중복 타이머 호출은 "보류"상태에있는 레코드를 처리하지 않는 것을 알고 있습니다.

+0

내 옵션 중 하나였습니다. 문제는 응용 프로그램이 충돌하면 어떻게됩니까? 당신은 "pending"에서 "not sent"로 레코드의 상태를 리셋 할 필요가있다.하지만 그것은 어렵지 않다. – Fredou

관련 문제