代码之家  ›  专栏  ›  技术社区  ›  Nick Meyer

在Windows服务中执行长时间初始化

  •  5
  • Nick Meyer  · 技术社区  · 14 年前

    当Windows服务启动(或暂停后恢复)而不阻塞服务控制管理器时,进行长时间初始化的最佳方法是什么?

    5 回复  |  直到 14 年前
        1
  •  9
  •   LBushkin    14 年前

    你可以使用 BackgroundWorker

    在这个世界上这样做很容易 OnStart() 你的方法 ServiceBase -派生类。还有一个合理的解释 good example on MSDN

    protected override void OnStart(string[] args)
    {
        var worker = new BackgroundWorker();
        worker.DoWork += DoSomeLongOperation;
    
        worker.RunWorkerAsync();
    }
    
    private void DoSomeLongOperation(object sender, DoWorkEventArgs e)
    {
       // do your long operation...
    }
    

    ProgressChanged RunWorkerCompleted 事件,以便您可以通知服务控制管理器您的进度和启动成功(或失败)。

        2
  •  2
  •   Alex    14 年前

    我做的很简单。我创建了一个方法,我把所有需要执行的重逻辑放在其中,然后我创建了一个计时器,它会在20秒后滴答作响并执行该方法。因此服务将启动,然后创建计时器,以20秒的间隔初始化它,然后完成初始化。20秒后,计时器将滴答作响并启动应用程序的业务逻辑。当然,你可以指定你想要的时间间隔。

    public partial class YourService: ServiceBase
    {
       System.Timers.Timer tmrOnStart;
    

    protected override void OnStart(string[] args)
    {
        //set the interval to 20 seconds
        tmrOnStart = new Timer();
        tmrOnStart.Interval = 20000;
        tmrOnStart.Enabled = true;
        tmrOnStart.AutoReset = false;
        tmrOnStart.Elapsed += new ElapsedEventHandler(tmrOnStart_Elapsed);
        tmrOnStart.Start();
    }
    

    当计时器触发已用事件时,它将执行以下方法:

    void tmrOnStart_Elapsed(object sender, ElapsedEventArgs e)
    {
        heavyBusinessLogicMethod();
    }
    

    你必须把你的逻辑放在heavyBusinessLogicMethod中。

        3
  •  1
  •   Steven Evers    14 年前

    我也必须这样做:我在启动时生成一个线程,它完成所有初始化,并在完成时将私有的“isInitialized”设置为true。服务定期执行操作(即,在计时器上),如果isInitialized未设置为true,则不会开始这些操作。

        4
  •  1
  •   Walter    14 年前

        5
  •  0
  •   Oleg    14 年前

    SetServiceStatus 具有 dwCurrentState=SERVICE_START_PENDING 一些 dwCheckPoint dwWaitHint ,共 SERVICE_STATUS dwWaitHint文件 挂起的启动操作所需的估计时间(毫秒)。在经过指定的时间之前,服务应该对 设置服务状态 DWI检查点 价值或变化 dwCurrentState dwWaitHint文件 http://msdn.microsoft.com/en-us/library/ms685996(VS.85).aspx