我的应用程序捕获捕获线程中的网络数据包(如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);
}
每个线程可能会运行只有几毫秒,但可以根据回调方法运行更长的时间。每次捕获数据包时都会启动它们,这可能非常频繁。
我现在的问题是以下几点:启动一个新线程的开销有多高?使用一个不断运行的线程池而不是高频创建新线程会更好吗?如果我的回调很慢,这可能会导致需要很多新线程,而旧线程仍在运行,所以我需要大量线程池,所以我可能需要一个动态增长的池。但是如果流量停止或高负载用户退订,这可能会导致很多空闲线程。你有什么建议?
'Paralell.For'和'Paralell.ForEach'是专为这一目的只(如果你的任务不是满足) –
@dcastro那么,有什么问题呢?为什么不分发所有内容并将其添加到单个线程的临时集合中,然后使用temp集合执行'Paralell.ForEach'。我在误解什么? –
他似乎不想等待这些线程完成,因此不需要临时集合。他似乎在寻找一种“忘却”的方法。当所有任务结束时,“Paralell.ForEach”结束。 – dcastro