我想了解ConcurrentPriorityQueue
的工作原理,可以在on the parallel example page.找到。 ConcurrentPriorityQueue
位于ParallelExtensionExtras项目的CoordinationDataStructures文件夹下。
所以我写了一个小例子,它启动了一系列任务,这些任务将并行插入队列,原因有两个:
但毕竟,我的笔记本电脑中只有一个核心似乎正在解决这个问题。
以下是代码:
class Program
{
public static ConcurrentPriorityQueue<int, string> _queue = new ConcurrentPriorityQueue<int, string>();
public static int _itemCount = 100000;
public static int _taskCount = 20;
static void Main(string[] args)
{
Task[] tasks = new Task[_taskCount];
for (int i = 0; i < _taskCount; ++i)
{
int prio = i; // possibly a closure problem here?
var task = Task.Factory.StartNew(() => EnqueueItems(prio));
tasks[i] = task;
}
Task.WaitAll(tasks);
for (int j = 0; j < _taskCount; ++j)
{
Console.WriteLine( j.ToString() + " count= " + _queue.Where(x => x.Key.Equals(j)).Count());
}
Console.ReadKey();
}
private static void EnqueueItems(int prio)
{
for (int i = 0; i < _itemCount; ++i)
{
_queue.Enqueue(prio, i.ToString());
}
}
}
因此,插入工作,但它很慢,只有一个核心加载。
目前我的唯一解释是队列减缓了整个过程 对于ConcurrentQueue而言,这将是多么令人讨厌。并且,因为它来自微软 本身,我没想到。
我的测试代码有问题吗?
略有变化答案 0 :(得分:-2)
尝试
Task.Factor.StartNew(..., cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Default)
LongRunning有助于更快地并行启动任务。