Windows服务应用程序安装

时间:2012-10-11 16:30:10

标签: c# multithreading windows-services

我是.NET的初学者。

我对运行多线程的Windows服务应用程序有疑问。我的问题是,当我尝试将我的应用程序注册到Windows服务时,我在服务窗口中的“启动”中看到了我的服务状态。我已经包含了几行代码来展示我想要做的事情。

protected override void OnStart(string [] args) {
    timer = Timer(5000);
    timer.Elapsed += new ElapsedEventHandler(OnElapsedTime); 
    timer.Start();

    // when I commented out Application.Run() it runs perfect.
    Application.Run(); // run until all the threads finished working
    //todo
}

private void OnElapsedTime(object s, ElapsedEventArgs e) {
    SmartThreadPool smartThreadPool = new SmartThreadPool();

    while( i < numOfRecords){
         smartThreadPool.QueueWorkItem(DoWork);
         //.....
    }
}

如果您需要进一步的信息,请告诉我。

1 个答案:

答案 0 :(得分:2)

在您使用它的上下文中,

Application.Run()只是告诉服务在同一个应用程序上下文中再次运行。作为Windows服务的一部分,应用程序上下文已存在于ServiceBase的上下文中。由于它是一项服务,它不会停止,直到它给出一条指令来停止通过需要它的方法,未处理的异常或外部命令。

如果您担心在线程处于执行过程中阻止停止,则您需要某种全局锁定,指示进程正在运行。它可能就像提升SmartThreadPool的范围一样简单:

private SmartThreadPool _pool = null;
private SmartThreadPool Pool 
{
    get
    {
        if (_pool == null)
            _pool = new SmartThreadPool();
        return _pool;
    }
}

protected override void OnStop()
{
   if (Pool != null)
   {
       // Forces all threads to finish and 
       // achieve an idle state before 
       // shutting down
       Pool.WaitForIdle();
       Pool.Shutdown();
   }
}