c# - 如何在不使用计时器的情况下在 Windows 服务中循环

标签 c# windows-services

我想每隔 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/

相关文章:

c# - C# Windows 服务是否需要大约 60-65 秒才能启动?

c# - 从 Windows 服务调用 Web 服务

c++ - 从服务运行程序

c# - 如何在 C# 中通过代码在文本框中向下滚动

c# - 使用 LINQ 计算与前一项的差异

c# - 如何重放已通过Azure服务总线处理过的消息?

c# - 安装 Windows 服务

c# - 是否可以在 Xamarin Forms Android 中动态更改标签栏所选项目的颜色?

C# 不重复的不可变和可变类型

tomcat - 如何从作为 Windows 服务运行的 Tomcat 获取堆转储?