2016-04-05 50 views
0

我想在預約時間前每3或5分鐘發一封電子郵件,但由於某些原因代碼每秒都會觸發,我只希望它在計時器到達threashold之前觸發分配的時間,但我無法實現。並且還會使調試更容易。僅當後臺計時器達到閾值而不是每分鐘時才希望觸發代碼?

protected void Page_Load(object sender, EventArgs e) { 
    Timer timer = new Timer(); 
    worker = new BackgroundWorker(); 
    worker.DoWork += worker_DoWork; 
    timer.Elapsed += timer_Elapsed; 
    timer.Interval = (1000) * (2); 
    timer.Enabled = true; 
    timer.Start(); 
} 

private void timer_Elapsed(object sender, ElapsedEventArgs e) { 
    if (!worker.IsBusy) 
     worker.RunWorkerAsync(); 
} 

private void worker_DoWork(object sender, DoWorkEventArgs e) { 
    //whatever You want the background thread to do... 
    doReminders(3); 
} 

/// <summary> 
/// Does the reminders. 
/// sends out reminders based on the amount of minuties before a meeting 
/// </summary> 
protected void doReminders(int reminder) { 
    try { 
     List<ApertureDal.Appointment> _appointments = _dal.GetAppointmentsByReminderLength(reminder); 

     _appointments.ForEach(x => { 
      _dal.sendAppointmentEmails(x.ID, x.emailAddress, x.TimeCode, x.emailAddress, new Guid(Constants.calenderEmail), x.CustomerFirstName, x.CustomerLastName, x.managerName, x.preferedContactNumber, x.emailAddress, x.Start, x.End, x.managerId); 
      }); 
    } catch (Exception ex) {} 
} 

編輯以顯示GetAppointments功能

/// <summary> 
/// Gets the appointments. 
/// </summary> 
/// <param name="reminderLength">Length of the reminder.</param> 
/// <returns></returns> 
public List<Appointment> GetAppointmentsByReminderLength(int reminderLength) 
    { 
     List<Appointment> list = new List<Appointment>(); 

     try 
     { 
      var q = from a in apertureNetEntities.Appointments //.Where(a => a.Start.Value.AddMinutes(-reminderLength) <= DateTime.Now) 
        select a; 

      list = q.ToList(); 
     } 
     catch (Exception ex) 

     { 
      string inner = string.Empty; 
      if (ex.InnerException != null) 
      { 
       inner = ex.InnerException.ToString(); 
      } 
      logger.Error("Error in List<Appointment> function GetAppointmentsByReminderLength " + ex.ToString() + " " + inner); 
      return null; 
     } 

     return list; 
    } 

編輯 目前它向我發送電子郵件98,即使我的分貝他們是唯一一個我測試記錄。

+0

我認爲問題在於_dal.GetAppointmentsByReminderLength(提醒),可能是不是很快的returnung約會。 – dryman

+0

@dryman我對問題進行了編輯以顯示GetAppointmentsByReminderLength – rogue39nin

+0

GetAppointmentsByReminderLength返回所有約會,無論它們是否到期,因爲LINQ Where在哪裏被評論。很明顯,它會每隔2秒發送一次所有約會。但是想要的行爲是什麼?如果它應該每隔3分鐘發送一次所有點數,請更改timer.interval,如果你想每2秒檢查一次,只發送預約,你應該取消LING Where的註釋並用它來過濾約會發送。 – dryman

回答

1

正如在評論中討論:

的問題是,在這個代碼是沒有識別是否郵件已發送與否。因此,如果預約到期,則會生成併發送電子郵件。 2秒鐘後再次檢查,仍然有任命,因此它會一遍又一遍地發送一封電子郵件。

在您的任命中需要有一些bool,您在_dal.sendAppointmentEmails中或之後設置了true,並在_dal.GetAppointmentsByReminderLength中讀取,然後選中。如果任命已被設置爲true,則您不必發送電子郵件(如果它仍然爲false),則發送電子郵件並將bool設置爲true,等等。

1

您正在將計時器間隔設置爲(1000) * (2) - 即 - 兩秒,因此計時器事件每2秒觸發一次。

+0

是的,我同意這也是他們的,但是我會如何設置它每隔30分鐘x然後確定它的apointment時間。 – rogue39nin

+0

您將需要創建一個您在發送電子郵件時設置的'boolean'標誌變量。每次計時器啓動時,您都應該檢查標記是否已設置,如果是,則不發送電子郵件。 –

相關問題