C# C“Windows服务”;暂停“;在引导期间启动系统时
我编写了一个windows服务,它使用一个WCF Web服务来监视各种系统活动。 其启动类型设置为自动,并在系统启动时按预期启动。在Windows7VirtualBox虚拟机上进行测试时,我注意到对WCF服务的初始调用超时 在做了一些研究之后,我发现在我的任何一个c#服务中,在引导后不让系统“稳定”一点的情况下对互联网进行任何形式的呼叫,都会导致系统基本上挂起大约一分半钟。我在其他裸露的金属盒子上试过这个,时间稍微短了一点,但还是发生了。 (可能是我以前没有注意到的原因。) 所以症状似乎是这样的。如果我将服务启动设置为自动(延迟启动),则只访问IP网站的测试服务将立即执行,不会延迟。如果我让服务自动启动并先休眠约20秒,它也会立即执行,不会延迟。如果我尝试在启动时立即执行命令,服务将在那里停留1:15到1:45 初步结论是,当我尝试访问网络时,有一个过程正在启动,但我无法确定是什么导致了这一点。 我可以将服务设置为延迟启动并完成它,但这违背了我正确操作的感觉 如果这是一个正在启动的服务,我想让我的服务依赖于它…等等。 有什么想法吗 我想说得很透彻,但这是我的第一个问题。我很乐意提供更多的细节。谢谢 以下是测试服务启动事件:C# C“Windows服务”;暂停“;在引导期间启动系统时,c#,windows,wcf,service,network-programming,C#,Windows,Wcf,Service,Network Programming,我编写了一个windows服务,它使用一个WCF Web服务来监视各种系统活动。 其启动类型设置为自动,并在系统启动时按预期启动。在Windows7VirtualBox虚拟机上进行测试时,我注意到对WCF服务的初始调用超时 在做了一些研究之后,我发现在我的任何一个c#服务中,在引导后不让系统“稳定”一点的情况下对互联网进行任何形式的呼叫,都会导致系统基本上挂起大约一分半钟。我在其他裸露的金属盒子上试过这个,时间稍微短了一点,但还是发生了。 (可能是我以前没有注意到的原因。) 所以症状似乎是这样的
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");
}
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;
}
}
下面是getExternalIP方法的代码:
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");
}
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;
}
}
这是立即启动的输出:
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");
}
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;
}
}
2017年3月16日上午7:57:08:开始
2017年3月16日上午7:57:09:TCPIP状态:运行
2017年3月16日上午7:57:09:DHCP状态:正在运行
2017年3月16日上午7:57:09:DNS状态:正在运行
2017年3月16日上午7:57:11:内部IP:192.168.2.103
2017年3月16日上午7:58:30:外部IP:xxx.xxx.xxx.xxx在应用程序中使用异步,以便主线程不会停止。但是,这将破坏您先显示“停止”,然后显示IP的一致性,因为对外部网站的呼叫可能需要一些时间才能解决。我建议打电话给警察
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);
}
在应用程序中使用异步,以便主线程不会停止。但是,这将破坏您先显示“停止”,然后显示IP的一致性,因为对外部网站的呼叫可能需要一些时间才能解决。我建议打电话给警察
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);
}
我经常对内部服务使用自动(延迟启动),以允许低级服务首先启动。或者,您可以进行研究以准确确定您的服务需要哪些服务,并将它们配置为服务的依赖项。我经常对内部服务使用自动(延迟启动),以允许低级服务首先启动。或者,您可以进行研究以准确确定您的服务需要哪些服务,并将它们配置为服务的依赖项。