Why Task.Factory.FromAsync is blocking

Viewed 78

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?

0 Answers
Related