【问题标题】:Need to increase window service timeout需要增加窗口服务超时
【发布时间】:2013-08-22 12:11:20
【问题描述】:

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

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

请帮帮我... 提前感谢

【问题讨论】:

  • XY 问题。消除 OnStart() 事件的大负载。摆脱废话。
  • 我在您的问题中找不到足够的信息来帮助您。可以考虑调试问题,可能的答案太多了。
  • 先生...实际上,当我在 Visual Studio 2010 中调试我的服务时,它工作正常...但是当我创建 exe 文件并将其安装在我的系统上并转到任务管理器以启动我的服务时然后发生超时异常......这是我的问题......现在我搜索了这个问题,发现,我需要增加我的启动时间,默认为 30 秒......

标签: c# service window


【解决方案1】:

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

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

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

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

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

来自MSDN

RequestAdditionalTime 方法旨在由 重写 OnContinue、OnPause、OnStart 或 OnStop 方法来请求 等待操作的额外时间,以防止服务 控制管理中心 (SCM) 将服务标记为无响应。如果 挂起的操作不是继续、暂停、开始或停止,而是 抛出 InvalidOperationException。

【讨论】:

  • 所以我必须添加 ServiceBase.RequestAdditionalTime(4000);在 Onstart(), OnPause(), OnStop(), OnContinue() 事件中????
  • 无论您需要在哪里增加默认超时。在您的情况下,您需要在开始时使用它。但同样不是一个好习惯
  • @user2499974: 你有什么理由不想开始一个新线程吗?这是正确的解决方案。
【解决方案2】:

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

protected override void OnStart(string[] args)
{
  Thread thWorker = new Thread(new ThreadStart(
    delegate
    {
       // Do your long operations here
    }
  ));
  thWorker.Start();
}

【讨论】:

  • 您必须在这里小心,因为如果委托抛出异常,它将被吞下,而不是停止/崩溃服务,您可能确实想要这样做,以便您知道服务不工作,而不是它“运行”,但实际上并没有做任何事情或正常工作。
  • @deadlydog 默认情况下,侧线程中抛出的未处理异常会杀死进程。例如看这个讨论:stackoverflow.com/a/17203553/717732
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    您是否考虑过为此使用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
    

    【讨论】:

      【解决方案5】:

      为了调试服务的 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-03
        • 2012-03-12
        • 2018-07-31
        • 1970-01-01
        • 2017-05-24
        • 1970-01-01
        • 2012-10-01
        • 1970-01-01
        相关资源
        最近更新 更多