CAUTION: This worked for me...Use it at your own risk.
I was given a task to upload billions of small (10k) files to Azure, yes that is billions with a B. Like everyone else I started by reading the MSDN docs and having it show me the toBlob.UploadFile and toBlob.UploadFromStream. Both proved to be a bit slow in my case. I can only assume the issue is the overhead of opening and closing the connections.
My first iteration was to just wrap everything with a Parallel.ForEach, and while this drastically improved things it still was not good enough.
My second iteration was to bump up the "Default Connection Limit" (see Line one in the example blow), again things got better but not good enough.
My third iteration was to use the Task.Factory.FromAsync to wrap the async calls that the API exposes in a Task, finally things are much better now. (see complete code sample below)