Multithreading in ambiente C#.
Nr. 30

15/07/2008
Multithreading in ambiente C# .

Mi è capitato recentemente di scrivere un programma che si occupi di sincronizzare due database. Situazione tipica dei contesti di e-commerce con un DB in DMZ ed uno in LAN e con un'operazione batch che riversa alcuni dati in maniera "acritica" nella direzione LAN -> DMZ e che compie il passaggio opposto integrando i dati letti con alcune elaborazioni (tipicamente l'ordine inserito nella form web contiene molte meno informazioni di quello direttamente inserito a gestionale).

Il software che avevo sviluppato inizialmente (basato su una serie di chiamate ad una routine inserite nel main) funzionava perfettamente salvo che per quei minuti che girava il sistema era quasi bloccato e la maschera principale "congelata", come ho avuto modo di sapere che si dice in questi casi. Altre volte mi era capitato il solito problema : questa volta che avevo un pò di tempo ho deciso di studiarci un pò più seriamente affrontando il tema del multithreading, in particolare in ambiente .NET.

Il concetto di base è che ciascun programma è associato un processo, ovvero un "tubo" di elaborazione isolato dagli altri. Il processo - identificabile col main del nostro codice e a cascata con tutte le sue subroutines - compie le operazioni che lo compongono in modo sequenziale e per farlo assorbe le risorse della macchina, in certi casi anche fino ad "ingessare" il tutto per mole di dati elaborata o per attese che può imporre alle varie periferiche.

Se il processo viene scomposto a sua volta in "tubi" fra di loro indipendenti - eventualmente sincronizzabili - questa situazione cessa perchè il nostro main blocca le risorse per il solo tempo necessario a lanciare i threads, che continuano a lavorare in background senza ingessare quindi il sistema.

Questa è (banalizzata) la teoria. Per la pratica vi rimando al seguente pdf : multithreading in ambiente C#. In questo caso non mi è stato possibile riportare anche il sorgente, che senza i database e vari elementi tipici del contesto in cui opera non girerebbe. Senza contare il fatto che tale operazione pubblicherebbe svariati dati riservati del committente... Questo implica che i pezzi di codice presenti nel documento a scopo "didattico" sono stati solo in parte testati direttamente : prendeteli con il beneficio di inventario !

In attesa magari del momento in cui ne avrò ricavato e compilato un esempio di sorgente da rendere scaricabile su questo sito, magari con le variabili in inglese così lo posso mettere anche su Codeproject.

Questo sito è ottimizzato per la risoluzione 1024x768, testato su Internet Explorer 6 e Mozzilla Firefox 2.