Jak metody asynchroniczne działają w języku C #?

W niektórych projektach używam metod asynchronicznych i podoba mi się, ponieważ pozwala to mojej aplikacji na bardziej skalowalne. Zastanawiam się jednak, jak metody asynchroniczne naprawdę działają w tle? Jak .NET (lub Windows?) Wie, że połączenie zostało zakończone? W zależności od liczby wykonanych wywołań asynchronicznych widzę, że tworzone są nowe wątki (nie zawsze…). Czemu?

Ponadto chciałbym monitorować, jak długo trwa wypełnianie wniosku. Aby przetestować koncepcję, napisałem następujący kod, który wywołuje asynchronicznie usługę sieciową i natychmiast po uruchomieniu stopera.

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

To nie działa, ponieważ wszystkie żądania (10000) mają ten sam czas rozpoczęcia i czas trwania będzie wzrastał liniowo (wywołanie 0 = czas trwania 1, wywołanie 1 = czas trwania 2 itd.). Jak mogę monitorować rzeczywisty czas trwania połączenia metodą asynchroniczną (od momentu, gdy żądanie jest rzeczywiście wykonywane do końca)?

AKTUALIZACJA: Czy metoda asynchroniczna blokuje przepływ? Rozumiem, że korzysta z .NETThreadPool ale jakIAsyncResult wiem, że połączenie zostało zakończone i czas zadzwonić doCallBack metoda?

questionAnswers(4)

yourAnswerToTheQuestion