Как асинхронные методы работают в C #?

Я использую асинхронные методы в некоторых моих проектах, и мне это нравится, потому что это позволяет моему приложению быть более масштабируемым. Однако мне интересно, как асинхронные методы действительно работают в фоновом режиме? Как .NET (или Windows?) Знает, что вызов завершен? В зависимости от количества асинхронных вызовов, которые я сделал, я вижу, что создаются новые потоки (хотя не всегда…). Зачем?

Кроме того, я хотел бы отслеживать, сколько времени потребуется для выполнения запроса. Чтобы проверить концепцию, я написал следующий код, который асинхронно вызывает веб-сервис и сразу после запуска секундомера.

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

Это неt работает, поскольку все запросы (10000) имеют одинаковое время начала, и продолжительность будет линейно увеличиваться (вызов 0 = длительность 1, вызов 1 = длительность 2 и т. д.). Как я могу отслеживать реальную продолжительность вызова с помощью асинхронного метода (с момента, когда запрос действительно выполняется до конца)?

ОБНОВИТЬ: Асинхронный метод блокирует поток? Я понимаю, что он использует .NETThreadPool но какIAsyncResult знать, что звонок завершен ивремя позвонитьCallBack метод?

Ответы на вопрос(4)

Ваш ответ на вопрос