我在启动窗口服务时遇到问题... 因为我的服务的OnStart()事件有很大的负担,它会废弃数据,将其保存到数据库并发送电子邮件。所以我的服务需要增加开始时间,因为defualt超时是30秒...... 我已经发布了当我遇到以下异常时我的服务需要额外的时间来启动..
“无法在本地计算机上启动MyName服务。错误1053:The 服务没有及时响应启动或控制请求 时尚“。
Plz帮帮我... Thanx提前
答案 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