需要增加窗口服务超时

时间:2013-08-22 12:11:21

标签: c# service window

我在启动窗口服务时遇到问题... 因为我的服务的OnStart()事件有很大的负担,它会废弃数据,将其保存到数据库并发送电子邮件。所以我的服务需要增加开始时间,因为defualt超时是30秒...... 我已经发布了当我遇到以下异常时我的服务需要额外的时间来启动..

  

“无法在本地计算机上启动MyName服务。错误1053:The   服务没有及时响应启动或控制请求   时尚“。

Plz帮帮我... Thanx提前

5 个答案:

答案 0 :(得分:10)

  

我意识到当我遇到以下异常时,我的服务需要额外的时间来启动

在构造函数/启动上执行长时间运行任务不是很好。你应该在sperate线程上开始你的长期运行任务。

服务启动应该是即时的,不应该挂断。

但是,如果你仍然想要,你可以这样做

ServiceBase.RequestAdditionalTime(4000); // add 4 seconds

来自MSDN

  

RequestAdditionalTime方法旨在由   覆盖要求的OnContinue,OnPause,OnStart或OnStop方法   等待操作的额外时间,以防止服务   控制管理中心(SCM)将服务标记为无响应。如果   挂起的操作不是继续,暂停,开始或停止,是   抛出InvalidOperationException。

答案 1 :(得分:3)

你最好在线程中进行长时间的操作。

protected override void OnStart(string[] args)
{
  Thread thWorker = new Thread(new ThreadStart(
    delegate
    {
       // Do your long operations here
    }
  ));
  thWorker.Start();
}

答案 2 :(得分:1)

调试OnStart服务(它可以是一个“长时间运行的任务”),我用这个:

    Protected Overrides Sub OnStart(ByVal args() As String)
 #If CONFIG = "Debug" Then
        ' 2 minutes before timeout
        Me.RequestAdditionalTime(2 * 60 * 1000)
        Debugger.Launch()
 #End If
.
.
.
    End Sub

答案 3 :(得分:0)

据我所知,硬限制正是为了防止服务中的这种滥用行为:)

让您的长时间运行任务在服务启动之外运行。处理优雅地停止服务,然后您可以在需要时自动停止服务。启动时无需做任何事情。

答案 4 :(得分:0)

您是否考虑过使用task paraller library。这个例子是VB.Net,但你明白了这个想法:

Imports System.Threading.Tasks

Public Class Service1

    Private tasks As New List(Of Task)

    Protected Overrides Sub OnStart(ByVal args() As String)
        tasks.Add(Task.Factory.StartNew(Sub() DoWork()))
    End Sub

    Private Sub DoWork()
        ' Do long running work
    End Sub

    Protected Overrides Sub OnStop()
        Task.WaitAll(tasks.ToArray())
    End Sub

End Class