[英]Windows Service that executes special function at specific time
我有一个Windows服务,它监视文件的Network文件夹,然后在Creation上移动该文件并进行一些变形。 这非常有效。
我的问题是,如果文件尚未在上午9:30之前保存到受监控位置,我需要让我的服务发送一封提醒邮件。 我希望不必为此编写第二个程序,这似乎是一个常见的建议(第二个程序与计划任务)。
那么,我的选择是什么? 我认为我可以用某种方式使用Timer来完成这项工作,但我知道这不是最好的主意。 有没有办法让计划任务使我的服务执行特定的功能?
谢谢你的任何想法......
编辑:作为参考我目前正在研究Quartz.NET , 起初看起来有点矫枉过正......
我没有看到使用计时器有什么不对,使用System.Timers.Timer并设置间隔为例如5分钟,然后在Elapsed事件检查当前时间,如果9:30传递发送邮件。
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) { }
}
}
}
我还建议第二个程序来检查和发送电子邮件,因为它不容易与服务通信。 这似乎是重复,但从长远来看,它将更容易开发和维护。
让第二个程序发送电子邮件,而不是让服务发送电子邮件。 如果要重用服务中的代码,请添加服务项目作为对第二个程序的引用。
这说起来容易做起来难,但它应该比尝试让第二个程序以某种方式与服务进行通信更容易,因为你必须自己连接通信机制。
你的帖子中有两个问题。 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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.