Nella serie degli "How do I? videos" di Microsoft alcuni video di ripasso sulle basi della programmazione multithread in .Net con un occhio all'aspetto mobile.
- How Do I: Use the ThreadPool to Execute Worker Threads?
ThreadPool. nulla da segnalare. - How Do I: Use a Monitor Object for Thread Synchronization?
L'oggeto Monitor per creare delle zone critiche ad accesso esclusivo nel codice. Il consiglio è quello di usere le funzioni Enter ed Exit dell'oggetto Monitor in zone vicine del codice e nella stessa funzione. A parer mio tanto vale usare la sintassi lock(syncObj) { ...sezione critica... }
- How Do I: Synchronize Multiple Threads?
- Uso di AutoresetEvent e dei suoi metodi Set (consente ad un solo thread di passare il semaforo) e WaitOne (resto in attesa di fronte al semaforo). La sincronizzazione in questione è tra il thread dell'UI che comanda tramite pressione di un pulsate il Set e un secondo thread separato che cicla indefinitamente e ad ogni ciclo si arresta sul WaitOne.
- Uso sistema classico per arrestare il thread secondario: sul thread principale una stopVariable (testata nella condizione di while) viene settata a true e si chiama il Join aspettando che il therad secondario esca. Attenzione liberare con un Set dal thread principale anche tutti i thread secondari fermi sul semaforo per non causare un deadLock (thread principale bloccato sul join e thread secondari bloccati sul WaitOne).
- Breve cenno al ManualResetEvent.
- Uso di AutoresetEvent e dei suoi metodi Set (consente ad un solo thread di passare il semaforo) e WaitOne (resto in attesa di fronte al semaforo). La sincronizzazione in questione è tra il thread dell'UI che comanda tramite pressione di un pulsate il Set e un secondo thread separato che cicla indefinitamente e ad ogni ciclo si arresta sul WaitOne.
- How Do I: Update User Interface Controls in Multithreaded Applications?
L'uso di Invoke per effettuare l'update di controlli nella UI da parte di funzioni chiamate da thread esterni. Unica cosa interessante del video è il finale in cui viene illustrato un possibile deadlock causato da un invoke chiamato da thread esterno mentre la UI è bloccata su un join aspettando che proprio quel thread abbia termine. Corretto poi usando nel thread esterno la versione asincrona BeginInvoke. - How Do I: Correctly Terminate Multithreaded .NET Compact Framework Applications?
Chiudendo la form principale viene terminato il thread della UI ma rimangono in piedi gli altri foreground thread lanciati dall'applicazione. Questi thread consumano risorse e non compaiono nel task manager. Per fare in modo che i thead secondari si chiudano automaticamente (e bruscamente) alla chiusura della form principale si possono dichiarare come background thread (IsBackground property). Se invece il thread ha de codice di inizializzazione o terminazione bisogna invece gestire esplicitamente la sua terminazione al Form Closing. Oppure cancellare l'evento di chiusura al form closing seganlando all'utente di stoppare le operazioni in corso.
Commenti
esiste supporto per il multi-threading anche nel dotnet micro framework ?
stefano