Tôi đang viết dịch vụ cửa sổ sẽ xử lý "vài thứ" mỗi vài phút.Hành vi hẹn giờ khi thực thi mất nhiều thời gian hơn span?
Dưới đây là một số mã:
public Service()
{
this.InitializeComponent();
this.ServiceName = Name;
this.CanPauseAndContinue = true;
this.CanShutdown = true;
this.eventLog.Source = Name;
// initialize timer
this.timer.Elapsed += this.TimerElapsed;
}
private void TimerElapsed(object sender, ElapsedEventArgs e)
{
eventLog.WriteEntry("Starting syncronization...", EventLogEntryType.Information);
if (this.processor.PrepareToRun())
{
this.processor.Run();
}
}
Tôi tự hỏi điều gì sẽ xảy ra nếu this.processor.Run()
sẽ mất thời gian dài và TimerElapsed
sự kiện tiếp theo sẽ được nâng lên? Nó sẽ bỏ qua? Nó sẽ chờ và chạy ASAP sau khi hoàn thành? Tôi có nên xem xét các kịch bản và mã đó cho họ không?
Tôi đang sử dụng System.Timers.Timer
EDIT:
private void TimerElapsed(object sender, ElapsedEventArgs e)
{
eventLog.WriteEntry("Starting syncronization...", EventLogEntryType.Information);
try
{
this.timer.Stop();
if (this.processor.PrepareToRun())
{
this.processor.Run();
}
}
catch (Exception ex)
{
LoggingAndNotifications.LogAndNotify(ex);
}
finally
{
this.timer.Start();
}
}
EDIT 2
public Service()
{
this.InitializeComponent();
this.ServiceName = Name;
this.CanPauseAndContinue = true;
this.CanShutdown = true;
this.eventLog.Source = Name;
// initialize timer
this.timer.AutoReset = false;
this.timer.Elapsed += this.TimerElapsed;
}
private void TimerElapsed(object sender, ElapsedEventArgs e)
{
eventLog.WriteEntry("Starting syncronization...", EventLogEntryType.Information);
try
{
if (this.processor.PrepareToRun())
{
this.processor.Run();
}
}
catch (Exception ex)
{
LoggingAndNotifications.LogAndNotify(ex);
throw;
}
finally
{
this.timer.Start();
}
}
Tôi thích # 4 cho tình huống cụ thể của mình. Chỉnh sửa của tôi (trong bài đăng gốc) có chính xác không nếu tôi muốn kịch bản đó? – katit
Dừng bộ hẹn giờ sẽ không giúp đỡ, cuộc gọi xử lý sự kiện đã qua có thể bị trì hoãn nếu có nhiều chuỗi TP hoạt động trong tiến trình. Đặt thuộc tính AutoReset thành false thay thế. –
Tôi rất thận trọng với 2. 1 hoặc là làm việc rõ ràng hay không, nhưng thật tuyệt khi bạn thực sự cần nó mỗi X phút. Sự khác biệt giữa 3 và 4 là giữa "mỗi x phút với một số bỏ qua" và "mỗi x phút sau khi kết thúc lần cuối". Cả hai đều có vị trí của họ và thường là tốt. Bạn không cần '.Stop()' bộ đếm thời gian, nó dễ dàng hơn và an toàn hơn (chỉ trong trường hợp một số trường hợp freaky có nghĩa là bạn thậm chí không nhận được rằng đến nay) để có nó không tự động thiết lập lại ở nơi đầu tiên. Đặt 'AutoReset' thành false hoặc sử dụng System.Threading.Timer với khoảng thời gian' Timeout.Infinite'. –