¿Cómo funcionan los métodos asíncronos en C #?

Estoy usando métodos asíncronos en algunos de mis proyectos y me gusta porque permite que mi aplicación sea mucho más escalable. Sin embargo, me pregunto cómo los métodos asíncronos realmente funcionan en segundo plano. ¿Cómo .NET (o Windows?) Sabe que se ha completado una llamada? Dependiendo de la cantidad de llamadas asíncronas que realicé, puedo ver que se crean nuevos subprocesos (aunque no siempre ...). ¿Por qué?

Además, me gustaría controlar cuánto tiempo se tarda en completar una solicitud. Para probar el concepto, escribí el siguiente código que llama a un servicio web de forma asíncrona e inmediatamente después inicia un 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

Esto no funciona ya que todas las solicitudes (10000) tienen la misma hora de inicio y la duración aumentará linealmente (llamada 0 = duración 1, llamada 1 = duración 2, etc.). ¿Cómo podría monitorear la duración real de una llamada con un método asíncrono (desde el momento en que la solicitud se ejecuta hasta el final)?

ACTUALIZAR: ¿Un método asíncrono bloquea el flujo? Entiendo que usa .NETThreadPool pero como unIAsyncResult saber que una llamada se completa y es hora de llamar alCallBack ¿método?

Respuestas a la pregunta(4)

Su respuesta a la pregunta