First, the best documentation on this is Part V CLR through C #.
http://www.amazon.com/CLR-via-C-Developer-Reference/dp/0735667454/ref=sr_1_1?ie=UTF8& QID = 1376239791 & cf = 8-1 & keywords = CLR + using + C % 23
Secondly, I would expect Parallel.Foreach to work better, because it will not only create Tasks, but also group them. In a book by Jeffrey Richter, he explains that tasks that run individually will be queued in the thread pool. There is some overhead to blocking the actual thread pool queue. To combat this, the tasks themselves have a turn for the tasks being created. This task subtask performed by tasks can actually do some work without blocking!
I would need to read this chapter again (chapter 27), so I'm not sure if Parallel.Foreach works this way, but this is what I would expect from this.
Blocking, he explains, is expensive because it requires access to the kernel level design.
In any case, do not expect them to be processed sequentially. Using Parallel.Foreach is less likely to be processed sequentially than the foreach keyword due to the aforementioned internal elements.
source share