Como os métodos assíncronos funcionam em c #?

Eu estou usando métodos assíncronos em alguns dos meus projetos e eu gosto, pois permite que meu aplicativo seja muito mais escalável. No entanto, estou querendo saber como os métodos assíncronos realmente funcionam em segundo plano? Como o .NET (ou o Windows?) Sabe que uma chamada foi concluída? Dependendo do número de chamadas assíncronas que fiz, posso ver que novos threads são criados (nem sempre ...). Por quê?

Além disso, gostaria de monitorar quanto tempo uma solicitação leva para ser concluída. Para testar o conceito, eu escrevi o código a seguir, que chama de forma assíncrona um serviço da Web e imediatamente após iniciar um cronômetro.

for (int i = 0; i < 10000; i++)
{
    myWebService.BeginMyMethod(new MyRequest(), result, new AsyncCallback(callback), i);
    stopWatches[i].Start();
}
// Call back stop the stopwatch after calling EndMyMethod

Isso não funciona, pois todas as solicitações (10000) têm o mesmo horário de início e a duração aumenta linearmente (chamada 0 = duração 1, chamada 1 = duração 2 etc.). Como eu poderia monitorar a duração real de uma chamada com método assíncrono (a partir do momento em que a solicitação é realmente executada até o final)?

ATUALIZAR: Um método assíncrono bloqueia o fluxo? Eu entendo que ele usa o .NETThreadPool mas comoIAsyncResult sabe que uma chamada é concluída e é hora de ligar para oCallBack método?

questionAnswers(4)

yourAnswerToTheQuestion