Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我需要开发一个webservices监控.net应用程序。设计这个的最好方法是什么_C#_.net 3.5 - Fatal编程技术网

C# 我需要开发一个webservices监控.net应用程序。设计这个的最好方法是什么

C# 我需要开发一个webservices监控.net应用程序。设计这个的最好方法是什么,c#,.net-3.5,C#,.net 3.5,需要开发一个Web服务器监控系统。可能有数百个Web服务器在不同的服务器上运行。该系统需要在给定的interva中保持对每个Web服务的监视,并在DB中更新状态 设计了当前的选项 选项1:创建类监控它有Method1,它以固定的间隔(比如10分钟)动态调用webservice,并将状态(失败/成功)数据存储到DB 在for循环中,我每次都创建一个新的监控类实例和一个新线程 例如 foreach(int i in idlist) { Monitoring monObj = new Monitori

需要开发一个Web服务器监控系统。可能有数百个Web服务器在不同的服务器上运行。该系统需要在给定的interva中保持对每个Web服务的监视,并在DB中更新状态

设计了当前的选项

选项1:创建类监控它有Method1,它以固定的间隔(比如10分钟)动态调用webservice,并将状态(失败/成功)数据存储到DB

在for循环中,我每次都创建一个新的监控类实例和一个新线程

例如

foreach(int i in idlist)
{
Monitoring monObj = new Monitoring();
Thread workerT = new Thread(monObj.MonitorWebService);
workerT.Start(i);
}
在MonitorWebService API中有一个无限for循环 它以1分钟或10分钟等间隔调用给定的Web服务。要在常规inverval中处理此问题,我使用EventWaitHandle.WaitOne(T1*1000,false)而不是Thread.Sleep()。这里T1可以是1分钟或1或5小时

行动2:

在for循环中,使用新名称打开一个新appdomain并打开一个新线程,如下所示

foreach(int i in idlist)
{
string appDNname = WSMonitor + i.ToString();
AppDomain WMSObj = AppDomain.CreateDomain(appDNname);
Type t= typeof(Monitoring);
Monitoring monWSObj = (Monitoring) WMSObj.CreateInstanceAndUnwrap(Assembly.GetExecuti ngAssembly().FullName, t.FullName);
Thread WorkerT = new Thread(monWSObj.MonitorWebService);
WorkerT.Start(i);
}
在选项2中,我在时间间隔超过10分钟时卸载AppDomain,并且在需要加载时卸载AppDomain。我认为选项2将在不需要资源时释放资源,并在需要资源时重新加载

哪种方法最好/更好?我们有更好的解决办法吗。非常感谢您的快速帮助

首先:

选项2不好。它不会卸载比选项1更多的数据。 .Net将在不再引用/需要时自动卸载所有应用程序数据。它只是不会卸载应用程序本身。但在您的情况下,无论如何都无法卸载应用程序本身,因此在这里使用AppDomain是完全无用的

选项1也不是很好,因为(滥用)Threadsyncs进行计时会产生巨大的开销,而且从来都不是一个好主意

更好的选择是:

1) 如果不需要永久运行,只需让外部windows任务计划程序在需要的时间调用应用程序即可。它的优点是易于外部配置,并且您根本不必担心代码中的任何计时问题

2) 如果您需要/想要永久运行,那么最简单、最清晰的方法就是使用一个可用的计时器对象


3) 如果您不喜欢2)使用带有Thread.Sleep的循环(不要试图滥用睡眠时间间隔来计时,只需睡眠1分钟,然后醒来检查是否需要完成任务)。

+1用于按计划任务运行;微软为我们提供了一个while基础设施,用于在给定的时间/间隔运行任务,在Vista/Windows7中,作为对发生事件的响应,不使用它是疯狂的。