Samo kao dopuna,
asinhroni delegati koriste ThreadPool.QueueUserWorkItem, medjutim da bi informacija bila predata handleru, asinhroni BeginInvoke koristi refleksiju nad definicijom delegata da kreira in-memory assembly sa klasom koja ce nositi rezultat i parametre poziva. Onda kreira wrapper oko handlera i opet koristi refleksiju da prenese parametre u thread (preko state parametra u QueueUserWorkItem) i pozove tvoj delegat na kraju iz svog wrappera koji vec radi u drugom threadu, onda na kraju ThreadPool uradi callback u delegat da je thread gotov; i na samom kraju delegat refleksijom izvuce rezultat i pozove tvoj callback sa IAsyncResult.
Mislim da je mnogo efikasnije zaobici refleksiju i sam napraviti malu klasu u nju potrpati paramtere, alocirati polje za rezultat i sam pozvati QueueWorkItem. Na kraju QueueWorkItem hendlera pozvati nazad metod na formi sa Form.BeginInvoke da se javi da je rezultat gotov.
Ima malo vise koda, ali je mnogo efikasnije ako se pokrece dosta worker threadova, posto se refleksija uopste ne koristi i nema dvostrukog callback-a. Sa druge strane asinhroni delegati imaju malcice manje koda. Sad ti vidi sta ti vise odgovara.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić