3

我有一个运行和启动良好的 Windows 服务,但是,它运行一个后台线程(其中多个),它执行一些严肃的计算。

经过一番挖掘,我发现这是由于所有 Windows 服务都有超时。目前,它从数据库中的表中读取,将其加载到对象中,然后对所述对象进行一些分析。这一切都在 OnStart 方法中完成,然后调用其他方法。是否有一些技巧可以让服务保持运行,或者有什么方法可以在不进入注册表的情况下停止超时?谢谢

4

2 回答 2

5

OnStart 函数不是需要长时间执行的逻辑的地方。基本上,您需要在 OnStart 函数之外为您的逻辑创建一个类。您需要公开声明一个入口函数——即获取数据并开始处理它的函数。

例如

class ProcessingClass()
{
    public void ThreadStartProc()
    {
         GetData();
         StartProcessing();
    }
 }

在您的 onStart 方法中,创建一个新 Thread 并将 ThreadStart 设置为您的 ThreadStartProc 函数。例如

Thread ProcessingThread;
ProcessingClass procClass = new ProcessingClass();

protected override void OnStart(string[] args)
{
    ProcessingThread = new Thread(new ThreadStart(procClass.ThreadStartProc));
    ProcessingThread.Start();
}

protected override void OnStop()
{
     if (ProcessingThread != null)
     {
          ProcessingThread.Abort();
          ProcessingThread.Join();
          ProcessingThread = null;
     }
}

在您的处理类中,您需要处理服务停止时将抛出的 ThreadAbortException。

于 2012-10-15T16:10:58.403 回答
4
  1. 将您的逻辑移出 OnStart 方法。
  2. 使用 Service.RequestAdditionalTime() 方法。

看到这个答案:windows service startup timeout

于 2012-10-15T15:45:35.347 回答