【问题标题】:Creating windows service without using timer control不使用定时器控制创建windows服务
【发布时间】:2020-03-06 08:07:36
【问题描述】:

我正在创建 Windows 服务,无论我阅读什么文章,他们都在使用 System.Timers.Timer,但没有提及他们使用它的原因。

必须使用Timer吗?

以下这些 url 使用 Timer 和 windows 服务

https://www.c-sharpcorner.com/UploadFile/8a67c0/create-and-install-windows-service-step-by-step-in-C-Sharp/

https://www.c-sharpcorner.com/article/create-windows-services-in-c-sharp/

https://dzone.com/articles/create-windows-services-in-c

https://www.aspsnippets.com/Articles/Tutorial-to-create-a-simple-Windows-Service-with-sample-example-in-C-and-VBNet.aspx

难道不能只用这些方法写代码来完成吗

protected override void OnStart(string[] args)
{
    base.OnStart(args);
    GetFailedProductDetails();
}

protected override void OnStop()
{
    base.OnStop();
}

编辑:

每 30 分钟执行一次服务的逻辑

<appSettings>
<add key ="Mode" value ="Interval"/>
<add key ="IntervalMinutes" value ="30"/>
<add key="ClientSettingsProvider.ServiceUri" value="" />
</appSettings>

我的目标:

我想每 30 分钟运行一次这个服务来执行GetFailedProductDetails() 方法。为此,我在App.config 文件中编写了代码。

【问题讨论】:

  • 服务在GetFailedProductDetails()之后做什么?它不应该重复它的工作吗?
  • 当您的业务案例不要求计时器时,请不要使用计时器。许多服务等待外部信号,或使用 FileSystemWatcher 或其他东西来触发它们所做的任何事情。描述你手头的任务,以及你遇到的问题。任何比无限循环更好的方法都可以解决问题 - 目标是当服务空闲时 CPU 使用率约为 0,而计时器是实现此目的的一种可能结构。
  • @oerkelens - 我想每小时重复一次,但我们必须在App.config 文件中写入代码。请检查更新的问题。
  • @CeeMcSharpface - 我想按照 app.confi 文件中的说明每 30 分钟执行一次 GetFailedProductDetails() 方法。这不是完整的代码吗?我认为这项服务将始终每 30 分钟启动一次,但是当我在几篇文章中看到计时器时,我感到很困惑。
  • OnStart 将在服务接收到来自操作系统(服务控制管理器)的启动命令、尚未运行或暂停时调用一次。 “每 分钟”绝对是计时器的有效用例。只需注意处理单个进程实例可能需要比间隔更长的情况,以免耗尽资源(队列或延迟)

标签: c# .net windows-services


【解决方案1】:

服务不会重复。它只是启动一次,然后只要不停止就运行。如果它需要执行重复的任务,您需要在您的代码中处理自己的重复。

当然,您可以设置一个带有无限 for-loop 和 Thread.Sleep() 的丑陋系统,但问题是,在启动服务时,Windows 需要 @987654323 @ 到 finish,因此它可以断定服务已启动,而不是仍在启动OnStart 函数应该准备一切以使服务操作运行,但它不应该自己执行这些操作。

因此,使用计时器的原因是OnStart 函数可以正确完成,然后定期地,服务操作(在您的情况下为GetFailedProductDetails() 函数)可以由计时器启动.


至于那段配置,正如我在评论中所说,有点 xml 不是代码。您从中复制的指南已明确编写程序来读取、解释和应用这些设置,以设置 Timer 对象以使其在配置的时间间隔内重复。复制该 xml 而不复制随附的代码对您没有任何帮助。

当然,您可以使用配置文件来设置间隔设置,但是您还必须实际编写代码来读取它们。不过,重复服务的概念需要这样的设置。您可以使用硬编码的半小时间隔完美地对服务进行编程,然后将其保留。

【讨论】:

    猜你喜欢
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 2013-10-03
    • 1970-01-01
    相关资源
    最近更新 更多