你有几个选择。从本质上最简单的选项开始,您可以决定将您的应用程序创建为控制台应用程序,并将可执行文件作为 Windows 任务计划程序中的任务运行。您需要做的就是将您的可执行文件分配为在任务中启动的程序,并让任务调度程序为您处理时间间隔。如果您不关心状态,这可能是首选方法,并且如果您真的不需要,这将避免您不必担心创建和管理 Windows 服务。有关如何使用调度程序的信息,请参阅以下链接。
Windows 任务计划程序
您可以执行此操作的下一个方法是创建一个 Windows 服务并在该服务中使用一个计时器,特别是System.Timers.Timer. 本质上,您可以将计时器间隔设置为您希望在运行流程之前经过的时间。然后,您将注册每次发生该间隔时都会触发的计时器滴答事件。在这种情况下,您基本上将拥有您想要运行的流程;如果您愿意,这可以启动附加线程。然后在初始设置之后,您只需调用计时器 Start() 函数或将 Enabled 属性设置为 True 即可启动计时器。可以在描述对象的 MSDN 页面上的示例中找到一个很好的示例。那里有很多教程展示了如何设置 Windows 服务,所以我不会专门讨论它。
MSDN:系统.计时器.计时器
最后,更复杂的是设置一个侦听 SqlDependency 的 Windows 服务。如果事情可能发生在您的应用程序之外的数据库中,但您需要在您的应用程序或其他一些服务中意识到它,则此技术很有用。以下链接有一个关于如何在应用程序中设置 SqlDependency 的很好的教程。
使用 SqlDependency 监控 SQL 数据库更改
我想从您的原始帖子中指出两件事,这些事情并非针对您的问题。
如果您正在编写一个真正的 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);
}
});