我想每隔 10 秒从 Windows 服务调用一个业务层方法(使用 C# 和 .NET 完成)。但是,我不想使用 Timer_Elapsed 事件,因为如果第一个线程/进程仍在运行,它会启动另一个线程/进程。我只需要一个单线程方法,因为多次调用同一个业务方法会产生不必要的并发症。
所以我在 on_start 中添加了一个 do--while 循环。我知道这不是正确的方法,因为它会生成此进程,如果服务关闭,该进程将成为孤儿。
我该如何解决这个问题?
问候, 泽
最佳答案
还有另一种获取定时执行的方法,WaitHandle.WaitOne() 方法提供了一个超时参数。这在服务中非常有效,因为它允许您在单个方法调用中实现停止服务和定期执行的需要。模板如下所示:
Thread Worker;
AutoResetEvent StopRequest = new AutoResetEvent(false);
protected override void OnStart(string[] args) {
// Start the worker thread
Worker = new Thread(DoWork);
Worker.Start();
}
protected override void OnStop() {
// Signal worker to stop and wait until it does
StopRequest.Set();
Worker.Join();
}
private void DoWork(object arg) {
// Worker thread loop
for (;;) {
// Run this code once every 10 seconds or stop right away if the service
// is stopped
if (StopRequest.WaitOne(10000)) return;
// Do work...
//...
}
}
关于c# - 如何在不使用计时器的情况下在 Windows 服务中循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2032808/