我在启动窗口服务时遇到问题......因为我的服务的 OnStart() 事件负载很大,它会废弃数据,将其保存到数据库并发送电子邮件。所以我的服务需要增加启动时间,因为默认超时是 30 秒......我已经发布,当我遇到以下异常时,我的服务将需要额外的时间来启动..
“无法在本地计算机上启动 MyName 服务。错误 1053:服务未及时响应启动或控制请求。”
请帮助我......提前谢谢
我意识到当我遇到以下异常时,我的服务将需要额外的时间来启动
在构造函数/启动上执行长时间运行的任务并不好。你应该在一个单独的线程上开始你的长时间运行的任务。
服务启动应该是即时的并且不应该挂断。
但是,如果你仍然想要,你可以这样做
ServiceBase.RequestAdditionalTime(4000); // add 4 seconds
来自MSDN
RequestAdditionalTime 方法旨在由重写的 OnContinue、OnPause、OnStart 或 OnStop 方法调用,以为挂起的操作请求额外的时间,以防止服务控制管理器 (SCM) 将服务标记为无响应。如果挂起的操作不是继续、暂停、开始或停止,则会引发 InvalidOperationException。
你最好在一个线程中进行长时间的操作。
protected override void OnStart(string[] args)
{
Thread thWorker = new Thread(new ThreadStart(
delegate
{
// Do your long operations here
}
));
thWorker.Start();
}
据我所知,硬限制正是为了防止这种来自服务的滥用行为:)
使您的长时间运行的任务在服务启动之外运行。优雅地处理停止服务,然后您可以根据需要在服务完成时自动停止服务。无需在启动时执行所有操作。
您是否考虑过为此使用任务并行库。这个例子是 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
调试服务的 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