Я использую асинхронные методы в некоторых проектах, и мне это нравится, потому что это позволяет моему приложению быть более масштабируемым. Однако мне интересно, как асинхронные методы действительно работают в фоновом режиме? Как .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
Это не работает, поскольку все запросы (10000) имеют одинаковое время начала, и продолжительность будет линейно увеличиваться (вызов 0 = длительность 1, вызов 1 = длительность 2 и т. Д.). Как я могу отслеживать реальную продолжительность вызова с помощью асинхронного метода (с момента, когда запрос действительно выполняется до конца)?
ОБНОВЛЕНИЕ : Асинхронный метод блокирует поток? Я понимаю, что он использует .NET ThreadPool
, но как IAsyncResult
знает, что вызов завершен, и пришло время вызвать метод CallBack
?