I have method:
public async Task SendAsync()
{
var tasks = new List<Task<Response>>();
foreach (var i in new int[]{ 1,2,3,4,5,6,7,8,9,10 })
{
var request = new Request(i);
var task = Task.Factory.FromAsync<Response>((callback, state) =>
{
var request = (Request)state;
var iar = request.BeginSend();
//callback(iar); - no difference?
return iar;
},
(asyncResult) =>
{
return EndSend(asyncResult);
}
, request);
tasks.Add(task);
}
var responses = await Task.WhenAll(tasks);
}
request.BeginSend takes 10-20ms. (send request)
EndSend takes 100-1000ms. (wait for response)
var responses = await Task.WhenAll(tasks) takes 0ms
Every FromAsync is hit one by one:
1 -> BeginSend
1 -> EndSend
2 -> BeginSend
2 -> EndSend
etc.
Await is after foreach. So, why FromAsync waits for the result of EndSend?
I expected result will be:
1 -> BeginSend
2 -> BeginSend
...
10 -> BeginSend
1 -> EndSend
2 -> EndSend
...
10 -> EndSend
I am missing something?