7

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

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

请帮助我......提前谢谢

4

5 回答 5

11

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

在构造函数/启动上执行长时间运行的任务并不好。你应该在一个单独的线程上开始你的长时间运行的任务。

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

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

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

来自MSDN

RequestAdditionalTime 方法旨在由重写的 OnContinue、OnPause、OnStart 或 OnStop 方法调用,以为挂起的操作请求额外的时间,以防止服务控制管理器 (SCM) 将服务标记为无响应。如果挂起的操作不是继续、暂停、开始或停止,则会引发 InvalidOperationException。

于 2013-08-22T12:17:56.343 回答
4

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

protected override void OnStart(string[] args)
{
  Thread thWorker = new Thread(new ThreadStart(
    delegate
    {
       // Do your long operations here
    }
  ));
  thWorker.Start();
}
于 2013-08-22T12:18:17.700 回答
2

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

使您的长时间运行的任务在服务启动之外运行。优雅地处理停止服务,然后您可以根据需要在服务完成时自动停止服务。无需在启动时执行所有操作。

于 2013-08-22T12:15:26.317 回答
1

您是否考虑过为此使用任务并行库。这个例子是 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
于 2013-08-22T12:22:46.093 回答
0

调试服务的 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
于 2017-11-29T12:16:05.900 回答