C# 需要增加窗口服务超时
我在启动窗口服务时遇到问题。。。 由于我的服务的OnStart()事件有很大的负载,它会丢弃数据,保存到数据库并发送电子邮件。所以我的服务需要增加启动时间,因为解除超时是30秒。。。 我已经发布,当我遇到以下异常时,我的服务将需要额外的时间启动 “无法在本地计算机上启动MyName服务。错误1053: 服务未及时响应启动或控制请求 时尚。” 请帮我。。。C# 需要增加窗口服务超时,c#,service,window,C#,Service,Window,我在启动窗口服务时遇到问题。。。 由于我的服务的OnStart()事件有很大的负载,它会丢弃数据,保存到数据库并发送电子邮件。所以我的服务需要增加启动时间,因为解除超时是30秒。。。 我已经发布,当我遇到以下异常时,我的服务将需要额外的时间启动 “无法在本地计算机上启动MyName服务。错误1053: 服务未及时响应启动或控制请求 时尚。” 请帮我。。。 Thanx Previous据我所知,严格限制是为了防止服务中的这种滥用行为:) 使长时间运行的任务在服务启动之外运行。优雅地处理停止服务,然
Thanx Previous据我所知,严格限制是为了防止服务中的这种滥用行为:) 使长时间运行的任务在服务启动之外运行。优雅地处理停止服务,然后,如果需要,您可以在服务完成时自动停止服务。启动时不需要做任何事情 我已经意识到,当我遇到以下异常时,我的服务需要额外的时间才能开始 在构造函数/start上执行长时间运行任务并不好。您应该在sperate线程上启动长时间运行的任务 服务启动应该是即时的,不应该挂断 但是,如果您仍然愿意,您可以这样做
ServiceBase.RequestAdditionalTime(4000); // add 4 seconds
从
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 of service(它可能是一个“长时间运行的任务”),我使用以下方法:
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
XY问题。删除OnStart()事件上的大负载。别胡说了,我在你的问题中找不到足够的信息来帮助你。你可以考虑调试这个问题,有太多可能的答案。先生…实际上,当我在Visual Studio 2010中调试我的服务时,它工作得很好…但是当我创建exe文件并在我的系统上安装它并转到任务管理器启动我的服务时,超时异常发生了…这是我的问题…现在我搜索了这个问题发现我需要增加启动时间,默认情况下为30秒…因此我必须添加ServiceBase.RequestAdditionalTime(4000);在Onstart()、OnPause()、OnStop()、OnContinue()事件中,您需要增加默认超时。在你的情况下,你一开始就需要它。但这又不是一个好主意practice@user2499974:是否有不想启动新线程的原因?这是正确的解决方案。在这里您必须小心,因为如果委托引发异常,它将被吞没,而不是停止/崩溃服务,您可能真的希望这样做,以便您知道服务没有工作,而不是“运行”,但实际上没有做任何事情或工作正常。@deadlydog默认情况下,侧线程中抛出的未处理异常会终止进程。例如,请参见本讨论: