我的应用程序捕获捕获线程中的网络数据包(如wireshark),并允许其他组件向捕获的数据包注册具有过滤条件的回调函数。 目前,每当我捕获这样的数据包时,我就为每个回调用户启动一个线程:
foreach (CCallbackFilterCondition hCallback in m_ahSubscribers)
{
// Raise callbacks in separate threads so they don't block the capture thread
ParameterizedThreadStart hPTS = new ParameterizedThreadStart(hCallback.raiseIfMeetsConditions);
Thread hCallbackThread = new Thread(hPTS);
hCallbackThread.Start(hPacket);
}
这些线程中的每一个可能只运行几毫秒,但可以运行更长时间,具体取决于回调方法。每次捕获数据包时都会启动它们,这可能非常频繁。
我现在的问题如下:启动新线程的开销有多高?使用不断运行的线程池而不是以高频率创建新线程会更好吗?如果我的回调很慢,这可能导致需要很多新线程,而旧的线程仍在运行,所以我需要池中的大量线程,所以我可能需要一个动态增长的池。但是,如果流量消失或高负载用户取消订阅,这可能会导致许多空闲线程。你有什么建议吗?
答案 0 :(得分:1)
我会使用.NET的ThreadPool
。不要担心需要更多线程,或者需要杀死无用的空闲线程:ThreadPool使用Hill-Climbing启发式算法来确定最佳线程数以实现最佳性能。
详细了解ThreadPool的工作原理:http://msdn.microsoft.com/en-us/magazine/ff960958.aspx