我有一个运行和启动良好的Windows服务,但是,它运行一个后台线程(多个)进行一些认真的计算。
经过一番挖掘,我发现这是由于所有Windows服务都有超时。 目前,它从数据库中的表中读取,将其加载到对象中,然后对该对象进行一些分析。 这一切都是在 OnStart 方法中完成的,该方法随后调用其他方法。 是否有一些技巧可以使服务保持运行或任何在不进入注册表的情况下停止超时的方法? 谢谢
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。
- 将逻辑移出 OnStart 方法。
- 使用 Service.RequestAdditionalTime() 方法。
看到这个SO答案:Windows服务启动超时