【发布时间】: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