Let's distinguish two different concepts:
- Concurrency: Doing more than one thing at a time.
- Parallelism: Doing lots of work by dividing it up among multiple threads that run concurrently.
(These definitions are from Stephen Cleary's Concurrency in C# Cookbook.)
Concurrency does not require multiple executors. It could work with a single one and it can use context switching to make progress on each task. (At a given point in a time it suspends the execution of a given task and it switches to another job.)
On the other hand when we talk about parallel processing then we can assume that there are multiple available executors and that's why multiple jobs can make progress at the same time.

Source
In case .NET when we talk about Parallel Programming most of the time we refer to CPU bound operations. That's why Parallel.Foreach, Parallel.For and Parallel.Invoke are designed for multi-threading.
If you visit the related MSDN article then it would be misleading at the first sight. It uses an example which reads files from a given folder. But please pay attention to this comment:
Parallel.ForEach(files, (currentFile) =>
{
// The more computational work you do here, the greater the speedup compared to a sequential foreach loop.
So, depending on the work what you want to do, Parallel.XYZ or PLinq may not be the best choice. If you want to execute multiple async I/O operations concurrently then Task.WhenAll is your best friend.
If you want to better understand parallel programming then I would suggest to read Stephen Toub's excellent whitepaper: Patterns of Parallel Programming C#
I would also encourage you watch Jeffry Richter's presentations about async I/O and scalable applications.