【问题标题】:Why does my .NET service start really slow on a XP boot为什么我的 .NET 服务在 XP 启动时启动很慢
【发布时间】:2011-01-14 03:39:16
【问题描述】:

我有一个 .NET windows 服务,它充当某些 wcf 的主机。在 OnStart 方法中,服务主机被创建和启动。该服务被配置为自动启动。这在 Windows 7(32 位和 64 位)上运行良好,并且可以在 Windows XP Pro SP3 上使用“net start”启动。使用“net start”命令启动服务大约需要 20 秒。

但是当 Windows XP Pro SP3 启动时,事件日志中会出现超时消息。服务本身不会启动失败,尽管它的依赖项是。该问题可以在各种 XP 机器上重现。核心数和内存没有影响。更新是最新的。

现在它变得很好奇:我分析了跟踪,发现服务启动大约需要 60 秒。因此,我添加了对 ReqestAdditionalTime(480000) 的调用。但现在该服务需要的时间略多于 480 秒。关系很明显。时间消耗在以下代码部分:

 var asyncResults = new List<IAsyncResult>();
 foreach (var host in myHosts)
   asyncResults.Add(host.BeginOpen(null, host));


  // wait until finished
  while (asyncResults.Count != 0)
  {
   IAsyncResult ar = asyncResults[0];
   if (!ar.IsCompleted) ar.AsyncWaitHandle.WaitOne(1000);
   if (ar.IsCompleted)
   {
        asyncResults.Remove(ar);
        var co = (ICommunicationObject)ar.AsyncState;

        try
        {
            co.EndOpen(ar);
        }
        catch (Exception ex)
        {
          ...
        }
   }
 }

你知道这里发生了什么吗?

【问题讨论】:

  • 所以您正在编写一个在启动时需要网络 IO 的服务。为什么不把它放在后台线程上,这样您的用户就不必等待了?
  • 只是因为如果 wcf 主机是打开的,则更难检测。客户端当前在访问服务之前检查服务是否处于运行状态。如果打开将使用单独的线程,我知道的唯一机会是尝试访问服务并等待超时或成功。

标签: c# .net wcf windows-xp service


【解决方案1】:

嘿,我自己通过深入的日志研究找到了解决方案。

在事件日志中有一些服务在我的服务超时后启动。由于我的服务作为特殊用户运行,我可以检测到两个服务,这些服务是由我自己的服务触发的。因此,我将它们添加到服务依赖项中并且它可以工作。

我想知道是否有一个文档,其中列出了 wcf 的依赖项。 作为参考这里是服务,我的服务依赖于:

  • http
  • RPCSS
  • CryptSvc
  • HTTP过滤器
  • 拉斯曼

后两个导致死锁的地方。

【讨论】:

    猜你喜欢
    • 2018-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 2022-10-22
    • 2014-07-17
    • 2014-09-23
    相关资源
    最近更新 更多