Как асинхронные методы работают в 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
метод?