C#Windows服务在启动期间启动时“暂停”系统

时间:2017-03-16 15:19:20

标签: c# windows wcf service network-programming

我编写了一个Windows服务,它使用一个监视各种系统活动的WCF Web服务。 其启动类型设置为“自动”,并在系统启动时按预期启动。在Windows 7 VirtualBox VM中进行一些测试时,我注意到对WCF服务的初始调用是超时的。

在做了一些研究之后,我发现在我的任何一个c#服务中,任何类型的呼叫都可以在没有让系统“安顿下来”的情况下进入互联网,导致系统基本上挂了大约一分钟半。我在其他裸机盒上试过这个,时间有点短,但它仍然会发生。 (可能是我之前没有注意到的原因。) 所以症状似乎是这样。如果我将服务启动设置为自动(延迟启动),则只会立即执行只能访问IP网站的测试服务。如果我使服务自动启动并首先休眠约20秒,它也会立即执行,没有延迟。如果我在启动时立即尝试执行该命令,那么服务就在那里以1:15到1:45。

初步结论是,当我尝试访问网络时,有一个进程正在启动,但我不知道是什么导致了这一点。 我可以将服务设置为延迟启动并完成它,但这会冒犯我正确做事的感觉。

如果它是一个正在开始的服务我想让我的服务依赖于它......等等。 有任何想法吗?

我试图彻底,但这是我的第一个问题。我很乐意提供任何其他细节。感谢。

以下是测试服务OnStart事件:

    protected override void OnStart(string[] args)
    {
        Logging.WriteLog("Starting");

        ServiceController sc = new ServiceController("Tcpip");
        Logging.WriteLog("TCPIP Status: " +sc.Status.ToString());

        sc = new ServiceController("DHCP");
        Logging.WriteLog("DHCP Status: " + sc.Status.ToString());

        sc = new ServiceController("Dnscache");
        Logging.WriteLog("DNS Status: " + sc.Status.ToString());

        Logging.WriteLog("Internal IP: " + getInternalIp());

        Logging.WriteLog("External IP: " + getExternalIp());
        Logging.WriteLog("Stopping");
    }

以下是getExternalIP方法的代码:

       private string getExternalIp()
    {
        try
        {
            string externalIP = "";
            try
            {
                //code hangs here
                externalIP = (new WebClient()).DownloadString("http://ipv4.icanhazip.com");
                externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                             .Matches(externalIP)[0].ToString();
            }
            catch (Exception ex)
            {
                Logging.WriteLog(ex);
            }
            return externalIP;
        }
        catch (Exception ex)
        {
            Logging.WriteLog(ex);
            return null;
        }
    }

以下是立即开始的输出:

3/16/2017 7:57:08 AM:开始

2017/3/16 7:57:09 AM:TCPIP状态:正在运行

3/16/2017 7:57:09 AM:DHCP状态:正在运行

2017/3/16 7:57:09 AM:DNS状态:正在运行

2017/3/16 7:57:11 AM:内部IP:192.168.2.103

3/16/2017 7:58:30 AM:外部IP:xxx.xxx.xxx.xxx< - 1分钟19秒延迟

3/16/2017 7:58:30 AM:停止

这里是延迟开始输出:

3/16/2017 8:03:39 AM:开始

3/16/2017 8:03:39 AM:TCPIP状态:正在运行

3/16/2017 8:03:39 AM:DHCP状态:正在运行

3/16/2017 8:03:39 AM:DNS状态:正在运行

3/16/2017 8:03:40 AM:内部IP:192.168.2.103

3/16/2017 8:03:40 AM:外部IP:xxx.xxx.xxx.xxx< - 无延迟

3/16/2017 8:03:40 AM:停止

1 个答案:

答案 0 :(得分:0)

在您的应用中使用Async,这样主线程就不会停止。但是,由于调用外部网站可能需要一些时间来解决,因此这将打破首先显示“停止”然后IP的一致性。我建议打电话给ExternalIP

  WebClient client = new WebClient();
  client.DownloadDataCompleted += DownloadDataCompleted;
  client.DownloadDataAsync(new Uri("http://ipv4.icanhazip.com"));


static void DownloadDataCompleted(object sender,
    DownloadDataCompletedEventArgs e)
{
    byte[] raw = e.Result;
    string data = System.Text.Encoding.Default.GetString(raw);
    data = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}"))
                             .Matches(data)[0].ToString();
    Logging.WriteLog("External IP: " + data);                            
}