我正在研究一个监控项目,它通过SNMP监控不同的目标,包括(交换机,路由器,PC,...)在特定的时间间隔内(大多数是60秒)。根据要监控的元素数量,某些监控过程需要很长时间,可能超过30秒。当目标数量超过2000并且大部分监控操作需要很长时间时,问题就会出现。这种情况监视操作overlap.it是因为显然没有可用的线程来分配它们,而cpu有四个core.i尝试下面的选项。
我发现当监视器进入队列和它真正开始执行时之间存在差距。事实上,(startMonitoringOperation - startMonitoring)=大间隔 这个大型互动可能超过2分钟。 我想知道同步长时间运行过程的最佳实践是什么。如何减少我之前提到的差距。
for (int I = 0 ;MonitorsQueue.Count;i++)
{
Var startMonitoring = DateTime.Now;
1.Threadpool.QueueUserWorkItem(new System.Threading.WaitCallback(DoMonitor),monitorObject);
2.var task = new task(() => DoMonitor(monitorObject),TakeCreationOptions.LongRuning);
3. var task = new task(() => DoMonitor(monitorObject));
}
Private void DoMonitor() //this Method take long in some occasions
{
Var startMonitoringOperation = DateTime.Now;
//Monintoring Operation
}
答案 0 :(得分:0)
这似乎是一个池大小的问题。将ThreadPool类中的线程数增加到3000以避免这种情况。但是,我建议您使用c#语言的async / await功能,而不是使用线程池来运行这样的线程,因为它们不是CPU密集型线程,而是等待I / O完成其工作。
通过使用async / await,在等待时间内不存在任何线程,这是您可以从中受益的。
祝你好运, 艾哈迈德