2012-10-05 128 views
0

我有一個監視文件的網絡文件夾的Windows服務,創建時移動該文件並進行一些變形。這很好。在特定時間執行特殊功能的Windows服務

我的問題是,如果一個文件在上午9:30之前還沒有保存到受監視位置,我需要讓我的服務發送提醒電子郵件。我希望不必爲此編寫第二個程序,這似乎是一個常見的建議(第二個程序與計劃任務)。

那麼,我有什麼選擇?我認爲我可以用某種方式使用Timer來完成這項工作,但我知道這不是最好的主意。有沒有辦法讓計劃任務讓我的服務執行特定的功能?

感謝您的任何想法...

編輯:供參考我目前正在研究Quartz.NET,就好像在第一次矯枉過正...

回答

0

我也建議第二個方案做檢查和發送電子郵件,因爲與服務交流並不容易。它可能看起來像重複,但從長遠來看,開發和維護會更容易。

而不是有服務發送電子郵件,有第二個程序發送電子郵件。如果要重用服務中的代碼,請將該服務項目添加爲第二個程序的引用。

說起來容易做起來難,但比試圖讓第二個程序以某種方式與服務通信更容易,因爲你必須自己連接通信機制。

+0

所以,你會寫第二程序VS使用定時器或類似的解決方案? –

+0

當然,爲什麼不呢?似乎更簡單的是,讓服務不斷檢查是否是9:30,然後執行一些特殊的代碼。你甚至在你的問題中說過,使用計時器並不是一個「不完美的想法」。 –

0

您的帖子中有兩個問題。 1.您需要調度員每天早上9:30檢查 2.如果沒有保存,您需要通過電子郵件通知。

其實Quartz.NET的使用非常簡單。我目前正在使用Quartz.NET執行我的一個計劃任務。您只需編寫4-5行代碼並完成作業調度部分。

來到您的電子郵件,您可以使用log4net。 Log4net有一個叫做SMTPAppender的東西。所有與log4net相關的配置都可以在web或app.config中指定。它也非常簡單直接。對於SMTPAppender樣本log4net的配置看起來象下面這樣:

<configuration> 
    <configSections> 
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" /> 
    </configSections> 
    <log4net> 
    <appender name="SMTPAppender" type="log4net.Appender.SMTPAppender"> 
     <authentication value="Basic" /> 
     <to value="[email protected]" /> 
     <from value="[email protected]" /> 
     <username value="user" /> 
     <password value="pass" /> 
     <subject value="ERROR" /> 
     <smtpHost value="host" /> 
     <port value="25" /> 
     <lossy value="true" /> 
     <evaluator type="log4net.Core.LevelEvaluator"> 
     <threshold value="WARN" /> 
     </evaluator> 
     <layout type="log4net.Layout.PatternLayout"> 
     <conversionPattern value="%newline%date [%thread] %-5level %logger %newline %message%newline%newline%newline" /> 
     </layout> 
    </appender> 
    <root> 
     <level value="INFO"></level> 
    </root> 
    <logger name="SMTPAppender"> 
     <level value="INFO"></level> 
     <appender-ref ref="SMTPAppender"></appender-ref> 
    </logger> 
    </log4net> 
</configuration> 
+0

感謝您的回答。實際上,我使用ExchangeWebServices進行電子郵件發送,效果很好。我將繼續關注Quartz。淨時間雖然。如果可能的話,我真的試圖避免將這樣一個簡單的應用程序分解到多個平臺和解決方案。 –

1

使用定時器我看不出什麼毛病,使用System.Timers.Timer並設置例如間隔爲5分鐘,然後在經過的情況下檢查目前的時間,如果9點30分過去發送郵件。

+0

我討厭甚至問,但System.Timers.Timer或System.Threading.Timer? –

+0

爲了類似的目的,我正在使用System.Timers(在新線程中產生已用過的事件),對於您的情況,我認爲沒有真正的區別或好處,請參閱http://msdn.microsoft.com/en-us/magazine /cc164015.aspx –

1

Personnaly,我建議System.Threading.Timer在同一個服務。

事情是這樣的:

using System; 
using System.Threading; 

public class Foo 
{ 
    private Timer _timer; 
    private readonly static TimeSpan TIME_OF_DAY = new TimeSpan(9, 30, 0); 

    public void Main() 
    { 
     var now = DateTime.Now; 
     var nextDt = now.Date.AddDays(1).Add(TIME_OF_DAY); 
     _timer = new Timer(TimerCallback, null, (int)nextDt.Subtract(now).TotalMilliseconds, Timeout.Infinite); 
    } 

    public void TimerCallback(object state) 
    { 
     try 
     { 
      // Reminder 
     } 
     finally 
     { 
      try 
      { 
       var now = DateTime.Now; 
       var nextDt = now.Date.AddDays(1).Add(TIME_OF_DAY); 
       _timer.Change((int)nextDt.Subtract(now).TotalMilliseconds, Timeout.Infinite); 
      } 
      catch (ObjectDisposedException) { } 
     } 
    } 
}