如何在不使用Timer的情况下在Windows服务中进行循环

Cha*_*kra 23 c# windows-services

我希望每隔10秒从Windows服务(使用C#和.NET完成)调用Business层方法.但是,我不想使用Timer_Elapsed事件,因为如果第一个线程/进程仍在运行,它将启动另一个线程/进程.我只需要一个单线程方法,因为对同一个Business方法的多次调用会产生不必要的复杂性.

所以我在on_start中添加了一个do-while循环.我知道这不是正确的方法,因为它会产生这个过程,如果服务被关闭,它就会成为一个孤儿.

我该如何处理这个问题?

此致,Chak

Han*_*ant 48

还有另一种获取定时执行的方法,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...
            //...
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 我根据上面的代码在我的公司运行了一项服务.它工作正常. (5认同)
  • @ vampire203:主循环将等待10秒然后完成工作,因此循环的总执行时间是完成工作所需的时间加上10秒.这或多或少是问题中要求的行为. (2认同)