【问题标题】:In a .NET service application, where do I add the functions that it should perform?在 .NET 服务应用程序中,我应该在哪里添加它应该执行的功能?
【发布时间】:2009-01-26 12:38:38
【问题描述】:

我知道如何“创建”服务应用程序。

我知道在 main() 函数中要写什么。

我知道如何将 EventLog(或其他组件)添加到服务中。

我知道如何定义服务启动、停止或恢复时会发生什么。

我想知道的是这个……

我希望我的 Windows 服务执行某些功能(如索引文件)。

在服务应用程序中的何处添加代码以执行此功能?

【问题讨论】:

  • 您能否更具体地说明“索引器功能”的含义?

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


【解决方案1】:

我假设您想要定期运行的东西,而不是经常运行。您可能需要考虑设置一个在到期时执行方法的计时器。计时器可以自动重置,或者您的回调可以在完成时重置计时器以使其下一次到期。您将在 OnStart 方法中初始化计时器。您需要小心在服务暂停或停止时停止计时器,并在关闭时清理。

您可能还需要考虑降低服务的优先级,以免它抢占系统上的前台任务。

【讨论】:

    【解决方案2】:

    我的猜测是您希望每 X 分钟建立一次索引,因此您可能希望在服务的 Start 事件中设置一个 Timer,然后在该计时器触发时执行您的索引。

    【讨论】:

      【解决方案3】:

      我将假设“索引器函数”是指您编写的希望通过 Windows 服务运行的库函数。如果是这种情况,请将您的代码添加到此覆盖方法中:

      protected override void OnStart(String[] args)
      {
          // your stuff here
      }
      

      此代码将在服务启动时触发。

      【讨论】:

      • 就这样...?只需将我的代码块添加到 OnStart,而不必担心执行我的代码需要多长时间?
      • 是的,只要它需要它就会运行。请记住,这样做既方便又危险。
      • OnStart 方法不应该执行除了一些快速设置然后异步启动实际工作之外的任何工作。通过计时器、新线程或作为线程池的工作项。如果 OnStart 方法没有快速返回,服务将被认为处于错误状态。
      【解决方案4】:

      我会说这取决于您的索引器函数应该何时运行。如果它应该在服务启动后立即开始运行,您将在 OnStart 方法中调用该函数。如果它是作为自定义事件的结果而启动的,那么您将在该事件的处理程序中调用它。如果需要在特定时间间隔后调用该函数,您可能需要使用 Timer。

      【讨论】:

        【解决方案5】:

        重复动作服务的简单示例,基于System.Timers.Timer

        using System;
        using System.Collections.Generic;
        using System.ComponentModel;
        using System.Diagnostics;
        using System.ServiceProcess;
        using System.Text;
        using System.Timers;
        
        namespace SrvControl
        {
        public partial class Service1 : ServiceBase
        {
            Timer mytimer;
            public Service1()
            {
                InitializeComponent();
            }
        
            protected override void OnStart(string[] args)
            {
                if (mytimer == null)
                    mytimer = new Timer(5 * 1000.0);
                mytimer.Elapsed += new ElapsedEventHandler(mytimer_Elapsed);
                mytimer.Start();
            }
        
            void mytimer_Elapsed(object sender, ElapsedEventArgs e)
            {
                //Do Anything, e.g. write to eventlog
            }
        
            protected override void OnStop()
            {
                mytimer.Stop();
            }
        }
        }
        

        【讨论】:

        • 服务中的计时器很糟糕,没有反对意见,但我不会推荐它们。 stackoverflow.com/questions/397744/…
        • 最近在 Q397744 中的注释说:从那时起,这两个服务都在运行,没有任何问题。请将其标记为“因不再相关而关闭”。
        猜你喜欢
        • 2021-06-27
        • 1970-01-01
        • 2020-12-29
        • 1970-01-01
        • 1970-01-01
        • 2013-11-14
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多