0

我有一个 Windows 服务,它监视文件的网络文件夹,并在创建时移动该文件并进行一些变形。这很好用。

我的问题是,如果文件在上午 9:30 之前还没有保存到受监控的位置,我需要让我的服务发送一封提醒电子邮件。我希望不必为此编写第二个程序,这似乎是一个常见的建议(带有计划任务的第二个程序)。

那么,我有哪些选择?我假设我可以使用 Timer 以某种方式完成这项工作,但我知道这不是最好的主意。有没有办法让计划任务让我的服务执行特定功能?

感谢您的任何想法...

编辑:作为参考,我目前正在研究Quartz.NET,起初似乎有点矫枉过正......

4

4 回答 4

1

我没有看到任何错误使用计时器,使用 System.Timers.Timer 并将间隔设置为例如 5 分钟,然后在 Elapsed 事件中检查当前时间,如果通过了 9:30 发送邮件。

于 2012-10-05T20:30:58.437 回答
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) { }
        }
    }
}
于 2012-10-05T21:10:04.667 回答
0

您的帖子中有两个问题。1. 您需要安排程序在每天上午 9.30 进行检查 2. 如果未保存,您需要通过电子邮件通知。

实际上 Quartz.NET 使用起来非常简单。我目前正在使用 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

我还建议使用第二个程序来进行检查并发送电子邮件,因为与服务进行通信并不容易。它可能看起来像重复,但从长远来看,它会更容易开发和维护。

与其让服务发送电子邮件,不如让第二个程序发送电子邮件。如果要重用服务中的代码,请将服务项目添加为对第二个程序的引用。

这说起来容易做起来难,但它应该比尝试让第二个程序以某种方式与服务通信更容易,因为您必须自己连接通信机制。

于 2012-10-05T20:24:52.450 回答