【问题标题】:Order Of Method Calls in a Windows ServiceWindows 服务中的方法调用顺序
【发布时间】:2012-06-30 07:10:19
【问题描述】:

Windows 服务中方法调用的顺序是什么?我们遇到了时间问题,我认为这是由于构造函数完成处理的时间过长。

这是我认为我们遇到的类似问题 Error 1053 the service did not respond to the start or control request

但是,我们想知道调用 Main、OnStart、InitializeComponent 等方法的顺序和时间和/或应该何时调用它们。

同样,OnStart 方法是否是放置所有处理的最佳位置?

**解决方案

花了一些时间做一个测试服务并测试了下面的响应,发现超时来自 Main 方法处理以及 Main 方法中调用的构造函数导致它超时。将所有内容移至 OnStart 以及仅关闭一个线程似乎可行。详情在这里。 http://www.adamthings.com/post/2012/06/28/error-1053-the-service-did-not-respond-to-the-start-or-control-request-in-a-timely-fashion/

【问题讨论】:

  • OnStart 应该启动另一个线程来处理您的所有处理,因此该方法可以立即返回。以我的经验,这效果最好。我不会在 InitializeComponent 中放任何东西。
  • OnStop 应该中止线程,并等待它完成:)
  • 你可以通过放置断点找出来。
  • 将两者都标记为正确答案(如果可以的话)。这是一篇评论我发现的博客文章。两者似乎都运作良好。 adamthings.com/post/2012/06/28/…

标签: c# windows-services


【解决方案1】:

不要在OnStart() 方法中阻塞。听起来你正在这样做。

OnStart() 方法中创建一个单独的线程并离开那里。

我没有对此进行测试,但类似于:

protected override void OnStart(string[] args)
{
    var worker = new Thread(DoWork);
    worker.IsBackground = false;
    worker.Start();

    base.OnStart(args);
}

private void DoWork()
{
    while (!_stopRequested)  // (set this flag in the OnStop() method)
    {
        // processing goes here
    }
}

要回答有关事件顺序的问题,只需在每个方法中设置 Trace 语句即可。我不确定这会有多大帮助。您收到的消息(服务未响应启动请求...)表明本应较快执行的方法被阻塞(或花费太长时间)。

【讨论】:

  • 这对我的思路有很大帮助。感谢您的答复。将我的发现发布在原始帖子的 cmets 中。
【解决方案2】:

我相信顺序是

至于将代码放在哪里,我建议将任何可以缓存的代码放在Main 中,以及任何在每次启动时回收的代码都放在OnStart 中。但是,您不应该在OnStart 中进行任何实际处理,只需初始化即可。使用单独的线程来处理大部分逻辑。

另外,MSDN is helpful with this

【讨论】:

  • 感谢您的回复,这很有帮助。将我的发现发布在原始帖子的 cmets 中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多