According to MSDN: https://msdn.microsoft.com/en-us/library/hh191443.aspx
"The async and await keywords don't cause additional threads to be created. Async methods don't require multithreading because an async method doesn't run on its own thread. The method runs on the current synchronization context and uses time on the thread only when the method is active. You can use Task.Run to move CPU-bound work to a background thread, but a background thread doesn't help with a process that's just waiting for results to become available."
So the .NET framework is not starting additional threads.
- What about the underlying OS?
- How are the blocking calls converted to non-blocking?
- What is the low level implementation?