我正在创建一个WindowsService,它将一个Timer绑定到一个具有无限循环的EventHandler;我希望能够在服务的OnStart()方法中触发此Timer一次,然后在服务的OnStop()中停止Timer。如何强制Timer只触发一次?
此外,这是控制WindowsService中无限循环的最佳设计吗?在另一个线程(也许是后台线程)中处理它会更好吗?
答案 0 :(得分:3)
在另一个线程(可能是后台线程)中处理它会更好吗?
是。听起来你最好使用单个后台线程而不是计时器。线程可以进入循环状态,直到您发出退出时间(在OnStop
方法中)。
新的Cancellation support in .NET 4提供了一种相当简洁的方法来“取消”你的无限循环......
答案 1 :(得分:1)
对于无限循环,使用专用工作线程会更好。如果使用某种类型的信号机制(如ManualResetEvent
来限制循环,那么你也可以使它停止。
public class YourService : ServiceBase
{
private ManualResetEvent StopRequested = new ManualResetEvent(false);
protected override void OnStart(string[] args)
{
new Thread(
() =>
{
while (!StopRequested.WaitOne(0))
{
// Infinite loop code goes here.
}
}).Start();
}
protected override void OnStop()
{
StopRequested.Set();
}
}
这种模式的好处是你可以在WaitOne
上设置超时参数来调整循环在迭代之间等待的时间。这基本上会给你与我计时器相同的效果。