【发布时间】:2013-09-27 16:31:12
【问题描述】:
我的应用程序在捕获线程中捕获网络数据包(如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 那么问题是什么?为什么不分派所有并将其添加到单个线程中的临时集合中,然后使用临时集合执行
Paralell.ForEach。我错过了什么吗? -
他似乎不想等待这些线程完成,因此不需要临时收集。他似乎在寻找一种“一劳永逸”的方法。当所有任务结束时,
Paralell.ForEach结束。 -
感谢您的建议,但我无法使用 Paralell.ForEach,因为我使用的框架是绑定到 .Net 3.5。
标签: c# multithreading threadpool