Task.Factory.StartNew不能并行工作?

时间:2014-08-11 21:37:16

标签: c# multithreading task

我想了解ConcurrentPriorityQueue的工作原理,可以在on the parallel example page.找到。 ConcurrentPriorityQueue位于ParallelExtensionExtras项目的CoordinationDataStructures文件夹下。

所以我写了一个小例子,它启动了一系列任务,这些任务将并行插入队列,原因有两个:

  1. 查看是否为线程安全
  2. 了解它的表现
  3. 但毕竟,我的笔记本电脑中只有一个核心似乎正在解决这个问题。

    以下是代码:

    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而言,这将是多么令人讨厌。并且,因为它来自微软 本身,我没想到。

    我的测试代码有问题吗?

    仅从MSDN on waiting for Tasks

    略有变化

1 个答案:

答案 0 :(得分:-2)

尝试

Task.Factor.StartNew(..., cancellationToken, TaskCreationOptions.LongRunning, TaskScheduler.Default)

LongRunning有助于更快地并行启动任务。