您有几种选择。要从本质上最简单的选项开始,您可以决定将您的应用程序创建为控制台应用程序,并将可执行文件作为Windows任务计划程序中的任务运行。您只需将可执行文件分配为程序即可开始执行任务,并让任务计划程序为您处理计时间隔。如果你不关心状态,这可能是首选的方法,并且如果你不需要,可以防止你不必担心创建和管理Windows服务。有关如何使用调度程序,请参阅以下链接。
Windows Task Scheduler
你能做到这一点,接下来的方法是创建一个Windows服务,并在服务中使用的定时器,具体System.Timers.Timer。从本质上讲,您可以在运行流程之前将计时器间隔设置为您想要通过的时间。然后,您将注册计时器滴答事件,每次发生该间隔时都会触发。在这种情况下,你基本上有你想要运行的过程;如果你愿意,这可以启动附加线程。然后,在初始设置后,您只需调用定时器Start()函数或将Enabled属性设置为True即可启动定时器。在MSDN页面描述对象的例子中可以找到一个很好的例子。有很多教程显示如何设置Windows服务,所以我不打算进入具体的。
MSDN: System.Timers.Timer
最后,更复杂的是设置一个侦听的SqlDependency一个窗口服务。如果事情可能发生在应用程序之外的数据库中,但您需要在应用程序或其他服务中使其知晓,则此技术非常有用。以下链接有关如何在应用程序中设置SqlDependency的很好的教程。
Using SqlDependency To Monitor SQL Database Changes
两件事情,我想从你的原帖指出,并非专门针对你有问题。
如果您正在编写真正的Windows服务,则不希望该服务停止。该服务应该不断运行,如果出现异常,应该适当处理并且不要停止服务。
取消标记不必引发异常;只是不调用ThrowIfCancellationRequested()将导致异常不会被抛出,或者如果这是CancellationTokenSource,则在Cancel方法上将参数设置为false,然后检查该令牌以查看是否在线程中请求取消并优雅地返回线程如果是这样。
例如:
CancellationTokenSource cts = new CancellationTokenSource();
ParallelOptions options = new ParallelOptions
{
CancellationToken = cts.Token
};
Parallel.ForEach(data, options, i =>
{
try
{
if (cts.IsCancellationRequested) return;
//do stuff
}
catch (Exception ex)
{
cts.Cancel(false);
}
});
我会看看初学者的生产者 - 消费者模式。一个线程可以轮询并收集工作信息,然后将其传递给队列处理程序。 –
您多长时间轮询数据库?这是服务将做的所有*吗?如果所有服务都是不频繁地轮询数据库并且可能运行一个很长的任务,那么你可能最好是编写一个普通的旧控制台应用程序,并将其设置为Windows中的计划任务。 –
您是否有任何链接可以在代码Grant中实现? 吉姆 - 我计划投票它也许有2分钟。是的,这是所有服务都可以做到的,但我稍后也可能会添加额外的功能来监控在线提要。 – user2647347