0

ファイルのネットワークフォルダーを監視するWindowsサービスがあり、作成時にそのファイルを移動し、いくつかの変容を行います。これはうまくいきます。

私の質問は、ファイルが午前 9 時 30 分までに監視対象の場所に保存されていない場合、サービスからリマインダー メールを送信する必要があるということです。これは、一般的な提案と思われる2番目のプログラムを作成する必要がないことを望んでいました(スケジュールされたタスクを使用した2番目のプログラム)。

それで、私のオプションは何ですか?何らかの方法でタイマーを使用してこれを機能させることができると思いますが、それが最善のアイデアではないことは理解しています。スケジュールされたタスクでサービスに特定の機能を実行させる方法はありますか?

アイデアをありがとう...

編集:参考までに、私は現在Quartz.NETを研究していますが、最初はやり過ぎのように思えました...

4

4 に答える 4

1

タイマーを使用しても問題はありません。System.Timers.Timerを使用して間隔をたとえば5分に設定し、経過イベントで現在の時刻を確認します。9:30が経過した場合はメールを送信します。

于 2012-10-05T20:30:58.437 に答える
1

個人的には、同じサービスで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) { }
        }
    }
}
于 2012-10-05T21:10:04.667 に答える
0

投稿に2つの質問があります。1.毎日午前9時30分にチェックするスケジューラが必要です。2。保存されていない場合は、電子メールで通知する必要があります。

実際、Quartz.NETの使い方はとても簡単です。現在、スケジュールタスクの1つを実行するためにQuartz.NETを使用しています。4〜5行のコードを記述して、ジョブスケジューリングの部分を実行するだけです。

あなたの電子メールに来て、あなたはlog4netを使うことができます。Log4netにはSMTPAppenderと呼ばれるものがあります。Webまたはapp.config自体で指定できるlog4netに関連するすべての構成。また、非常にシンプルで非常に簡単です。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="xxx@xxx" />
      <from value="yyy@yyy" />
      <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>
于 2012-10-05T20:30:34.733 に答える
0

また、サービスとの通信は簡単ではないため、チェックを行って電子メールを送信するための 2 つ目のプログラムをお勧めします。重複しているように見えるかもしれませんが、長期的には開発と保守が容易になります。

サービスに電子メールを送信させるのではなく、2番目のプログラムに電子メールを送信させます。サービスからコードを再利用する場合は、サービス プロジェクトを 2 番目のプログラムへの参照として追加します。

言うは易く行うは難しかもしれませんが、通信メカニズムを自分で配線する必要があるため、2 番目のプログラムを何らかの方法でサービスと通信させるよりは簡単なはずです。

于 2012-10-05T20:24:52.450 に答える