C# 需要增加窗口服务超时

C# 需要增加窗口服务超时,c#,service,window,C#,Service,Window,我在启动窗口服务时遇到问题。。。 由于我的服务的OnStart()事件有很大的负载,它会丢弃数据,保存到数据库并发送电子邮件。所以我的服务需要增加启动时间,因为解除超时是30秒。。。 我已经发布,当我遇到以下异常时,我的服务将需要额外的时间启动 “无法在本地计算机上启动MyName服务。错误1053: 服务未及时响应启动或控制请求 时尚。” 请帮我。。。 Thanx Previous据我所知,严格限制是为了防止服务中的这种滥用行为:) 使长时间运行的任务在服务启动之外运行。优雅地处理停止服务,然

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

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

请帮我。。。
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默认情况下,侧线程中抛出的未处理异常会终止进程。例如,请参见本讨论: