【问题标题】:Windows Service Idea?Windows 服务理念?
【发布时间】:2011-05-23 18:15:20
【问题描述】:

让我解释一下场景以及我想要完成的任务。

场景: 我有一个 Web 应用程序,它收集日期(例如 07/12/2011)和时间(例如下午 7:45)并将它们存储到数据库 (SQL) 中。

我正在尝试做的事情: 2011 年 7 月 12 日晚上 7:45,我想调用一个 Web 服务来运行另一个作业。

我正在考虑构建一个每天每 15 分钟运行一次的 Windows 服务,收集所有“待处理”请求(日期和时间),将它们排队,并按该顺序执行请求。

请随时为此提供任何其他方法。

【问题讨论】:

  • 如果您只希望它在 2011 年 7 月 12 日晚上 7:45 运行,为什么要每 15 分钟检查一次?
  • 不是每 15 分钟检查一次,如果它是晚上 7 点 45 分,您难道不能简单地使用 Windows 调度程序来执行此操作吗?
  • 我假设您有很多这样的,并且您希望每个人都做不同的事情?
  • 好吧,用户可以提交多个日期和时间。所以服务必须选择所有这些并执行。

标签: c# .net asp.net windows-services


【解决方案1】:

过去,当我这样做时,我使用Windows Task Scheduler 来运行我想要的 exe。

对于您想要做的 Windows 服务似乎有点矫枉过正,我通常只是创建一个基本的控制台应用程序来满足我的需要。使用任务计划程序,您可以准确指定何时运行它并完成。

【讨论】:

  • 感谢您的回复。如果有 2 个条目彼此非常接近怎么办。一个是晚上 7:45,另一个是同一天晚上 7:46。我应该考虑并行吗?是的,我使用的是 .NET 4.0。
  • 你应该没问题。如果您每天 24 小时每分钟运行一次,那么您应该考虑使用 Windows 服务。如果每天一次连续两分钟,只要第一个的输出不影响第二个,我可能仍会使用任务计划程序。
【解决方案2】:

Windows 服务为此类问题增加了(有时)不必要的复杂性。

我建议从一个简单的控制台应用程序开始,并使用 Windows 调度程序每 x 分钟运行一次。

如果您决定稍后转换为“真正的”服务,则几乎所有代码都应该是可重用的。

【讨论】:

    【解决方案3】:

    您可以在编写 Windows 服务之前评估以下解决方案。

    http://www.firedaemon.com/ - FireDeamon 提供了用于调度作业的免费版本。 http://quartznet.sourceforge.net/ - 一个开源调度库,如果您的 Windows 服务需要支持更多功能,可以使用。

    如果您正在使用 .NET Framework 4,这个link 应该可以对这个问题有所了解。

    【讨论】:

      【解决方案4】:

      我使用Quartz.Net 取得了一些成功。它比您描述的要灵活一些。安排新任务非常简单:

          public static void Schedule(DateTime when, string applicationId)
          {
              ISchedulerFactory factory = new StdSchedulerFactory();
              IScheduler scheduler = factory.GetScheduler();
      
              JobDetail jobDetail = new JobDetail("Realization Job", null, typeof(CustomTask));
              jobDetail.JobDataMap["applicationId"] = applicationId;
      
              Trigger trigger = new SimpleTrigger("Custom Task Trigger", DateTime.UtcNow, null, 0, TimeSpan.Zero);
              scheduler.ScheduleJob(jobDetail, trigger);
          }
      

      请注意,我有一个围绕JobScheduler 的包装器,允许它充当Windows 服务。将其创建为 Windows 服务可以让我拥有更强大的错误处理能力,并且不会像任务计划程序那样强迫我依赖操作系统。

      【讨论】:

        【解决方案5】:

        我在不同的 Web 项目中同时使用了 Windows Task Scheduler 和 Windows 服务,两者各有千秋。

        就个人而言,我更喜欢使用计划任务。通常,我会有一个小型通用工具调用主 Web 应用程序中的 URL。有点像网络服务调用。输出会附加到日志文件中。
        此设置的好处是,如果您部署新版本的 Web 应用程序,服务也会更新。

        仅当您必须执行长时间运行的任务或需要访问不安全资源的任务时,我才推荐使用 Windows 服务,因为这些任务不适用于 Web 应用程序。 再说一遍,同样的任务也可以通过命令行工具来执行。

        在实践中,我发现 Windows 服务的主要问题是它们无限期地运行。在一个完美的世界里,这不是问题。然而,在现实世界中,我看到服务泄漏内存(是的,基于 .NET 的服务)。随着时间的推移,这些服务将开始占用越来越多的资源。
        计划任务将为每次调用启动一个新进程,从而限制泄漏任务可能造成的损害。

        【讨论】:

          猜你喜欢
          • 2013-04-07
          • 2019-01-19
          • 1970-01-01
          • 1970-01-01
          • 2021-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-03
          相关资源
          最近更新 更多