【发布时间】:2011-09-06 10:12:51
【问题描述】:
我有一个队列,其中放置了待处理的傅立叶变换请求(相对耗时的操作) - 在某些情况下,我们每秒可以收到数千个变换请求,所以它必须很快。
我正在升级旧代码以使用 .net 4,以及移植到 TPL。我想知道处理这个队列的最有效(最快的吞吐量)方法是什么样的。我想使用所有可用的内核。
目前我正在尝试使用 BlockingCollection。我创建了一个生成 4 个任务的队列处理程序类,这些任务在 BlockingCollection 上阻塞并等待传入的工作。然后,他们处理该挂起的转换。代码:
public class IncomingPacketQueue : IDisposable
{
BlockingCollection<IncomingPacket> _packetQ = new BlockingCollection<IncomingPacket>();
public IncomingPacketQueue(int workerCount)
{
for (int i = 0; i < workerCount; i++)
{
Task.Factory.StartNew(Consume);
}
}
public void EnqueueSweep(IncomingPacket incoming)
{
_packetQ.Add(incoming);
}
private void Consume()
{
foreach (var sweep in _packetQ.GetConsumingEnumerable())
{
//do stuff
var worker = new IfftWorker();
Trace.WriteLine(" Thread {0} picking up a pending ifft".With(Thread.CurrentThread.ManagedThreadId));
worker.DoIfft(sweep);
}
}
public int QueueCount
{
get
{
return _packetQ.Count;
}
}
#region IDisposable Members
public void Dispose()
{
_packetQ.CompleteAdding();
}
#endregion
}
这看起来是一个好的解决方案吗?似乎所有核心都最大化了——尽管我目前不确定我应该在构造函数中生成多少工人。
【问题讨论】:
-
附带说明,您还可以使用英特尔 IPP 来加速傅立叶变换工作(然后在一个内核上运行的每个线程将使用 SSE 指令来完成工作),但是您很高兴互操作的 ;-)
标签: c# multithreading c#-4.0 task-parallel-library