I recommend you use TAP for I/O-based concurrency, and TPL for CPU-based concurrency. Since a WebAPI call is I/O-bound, you should be using TAP and not TPL.
There's no need to call Task.Run
in this case:
int requests = 100;
for (var i = 0; i < requests; i++)
{
int taskNumber = i + 1;
var task = PostAsync(taskNumber, address, client);
}
You could also use Task.WhenAll
for a TAP-based join:
int requests = 100;
var tasks = Enumerable.Range(0, requests).Select(x => PostAsync(x + 1, address, client));
await Task.WhenAll(tasks);
Also, HttpClient
is mostly threadsafe. Details are on its MSDN page.