Apeluri asincrone realizate în C#
Practica bate teoria, aşa îmi spun mulţi după prima parte “Concurenţă, multithreading şi asincronism” . Aşa că să continuăm, dar puţin altfel…
Framework-ul .Net oferă un mecanism implicit ce permite de apelat asincron orice metodă. Iar activităţile implicate ar trebui:
- să definească delegatul cu signatura metodei;
- să utilizeze metodele BeginInvoke (apel asincron) şi EndInvoke(apel sincron realizat la finisarea execuţiei) definite automat de CLR;
- se urmărească execuţia prin obiectul de tip IAsyncResult, etc.
Pentru exemplificarea celor menţionate mai sus eu prezint studenţilor mei o aplicaţie banală cu o fereastră pe care sunt plasate două componente ListBox, cărora se adăugă “simultan” elemente.

Mecanismele .Net ne scutesc de multe detalii, astfel simultaneitatea este realizată cu ajutorul apelurilor asincrone ale metodei AddItemsToListBox prin addMethod.
public partial class Form1 : Form{ //... delegate void AddItemsTo(ListBox list); void AddItemsToListBox(ListBox list) { for(int i=0; i < 100;i++) { list.Items.Add(i); } } private void button1_Click(object sender, EventArgs e) { AddItemsTo addMethod = new AddItemsTo(AddItemsToListBox); IAsyncResult tok1 = addMethod.BeginInvoke(listBox1, null, null); IAsyncResult tok2 = addMethod.BeginInvoke(listBox2, null, null); addMethod.EndInvoke(tok1); addMethod.EndInvoke(tok2); } //... }
Se menţionează că fiecare execuţie se face într-un fir aparte din Thread Pool, deci nu se recomandă un număr prea mare de apeluri simultane asincrone.
De sigur exemplul este mult simplificat, căci în mod normal EndInvoke ar fi trebuit să fie apelat în metoda callback, al cărei delegat se indică în parametrul doi al metodei BeginInvoke. Astfel se evită apelul sincron EndInvoke într-o metoda ce serveşte interfaţa utilizator.









Cine dorește să treacă cu vederea sau chiar să cunoască mai detaliat acest mecanism, poate deschide cartea "Essential .NET, Volume 1: The Common Language Runtime" de Don Box, capitolul 6
. Carte este pe http://www.pdfchm.com
Articolul provoacă !!! Mulțumesc !!!
PS: Eu sînt convins că mulți au citit articolul și o să citească, acesta înseamnă că deschid o paranteză interesant cîți din aceștea au să o închidă
….
"De sigur exemplul este mult simplificat, căci în mod normal EndInvoke ar fi trebuit să fie apelat în metoda callback"
…
Nu doar metoda callback – poate fi si o metoda anonima.
Daca nu am facut asta asa cum trebuie la universitate, in practica oricum am facut
Leave your response!
Aviz
Categorii
Blogroll