Używam metod asynchronicznych w niektórych moich projektach i lubię to, ponieważ pozwala to mojej aplikacji być bardziej skalowalne. Zastanawiam się jednak, jak metody asynchroniczne naprawdę działają w tle? W jaki sposób .NET (lub Windows?) Wie, że połączenie zostało zakończone? W zależności od liczby wykonanych asynchronicznych wywołań, widzę, że tworzone są nowe wątki (nie zawsze jednak ...). Czemu?Jak działają metody asynchroniczne w języku C#?
Ponadto chciałbym monitorować, jak długo trwa wykonanie żądania. Aby przetestować koncepcję, napisałem następujący kod, który wywołuje asynchronicznie usługę sieci Web 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 wnioski (10000) mają taki sam czas rozpoczęcia i czas trwania będzie się liniowo (wezwanie 0 = czas trwania 1, połączenie 1 = czas trwania 2, itd.). Jak mogę monitorować rzeczywisty czas trwania połączenia metodą asynchroniczną (od momentu, gdy żądanie jest naprawdę wykonywane do końca)?
UPDATE: Czy metoda asynchroniczna zablokować przepływ? Rozumiem, że używa on .NET ThreadPool
, ale jak IAsyncResult
wie, że połączenie jest zakończone i nadszedł czas, aby zadzwonić do metody CallBack
?
1. ThreadPool, 2. Zobacz szczegóły na temat działania ThreadPool, ale nie sądzę, że to, co chcesz, jest możliwe w sposób ogólny. http://msdn.microsoft.com/en-us/library/ms973903.aspx –