Passa ai contenuti principali

Threading with .Net Compact Framework

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: 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.

  • 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

stefano busolin ha detto…
ciao, una domanda:
esiste supporto per il multi-threading anche nel dotnet micro framework ?
stefano
Mauro Cavallin ha detto…
Nel .Net Micro Framework può girare solo un'applicazione (processo) alla volta, per affrontare la programmazione concorrente si possono quindi usare solo i Thread (Micro Framework implementa un sottoinsieme di System.Threading). Un'applicazione parte sempre come singolo thread (Main thread) creato automaticamente dal runtime, thread secondari possono essere lanciati, sospesi e sincronizzati tramite i costrutti soliti del .Net framework (metodi sincronizzati, lock, Monitor, e le classi derivate da WaitHandle). Ad ogni thread può essere concesso più o meno tempo cpu rispetto agli altri tramite la prop ThreadPriority.

Post popolari in questo blog

Log.Net: Conflitto Con CrystalReport per Visual Studio 2010

Situazione: Web Application Asp.Net 4.0, Utilizzo delle librerie di Crystal Report per VS2010. Il progetto web utilizza Log.Net, scaricato dal sito ufficiale. Un problema simile si verifica con applicazioni Windows Form. Problema: Le due librerie vanno in conflitto sia in fase di compilazione ( 1550854 - "Could not load file or assembly 'log4net' or one of its dependencies" Error when building Visual Studio 2010 solution utilizing the Crystal Reports .NET Runtime ), sia una volta installata sulla macchiana target (L'inizializzatore di tipo di 'CrystalDecisions.Shared.SharedUtils' ha generato un'eccezione. Impossibile caricare il file o l'assembly 'log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=692fbea5521e1304' o una delle relative dipendenze. La definizione di manifesto dell'assembly specificato non corrisponde al riferimento all'assembly.). Soluzione Spiegata: Il thread in cui ne parlano. A quanto ho ca

Richiesta di conferma Javascript sul Submit di una Form

Senza ricorrere ai plugin per visualizzare messageBox in jQuery. Il linguaggio Javascript già permette di usare la funzione confirm(), un analogo dell'alert che presenta all'utente la possibilità di scegliere fra Ok e cancel e ritorna il valore true/false di conseguenza. La funzione si può usare direttamente nell'html. input type="image" src="delete_16x16.gif" onclick="return confirm('Procedere con la cancellazione?');" title='Elimina'

SqlServer di Aruba - Entity Framework 4.0 - Problema dello Schema

Lo schema in MsSql è un elemento intermedio fra il database e le tabelle, lo schema predefinito è dbo e compare nel nome tabella come [dbo].[NomeTabella] .  In fase di generazione di un modello .edmx Entity Framework permette di impostare lo schema tramite la proprietà "Database Schema Name" dell'edmx.  Questo valore però non sarà modificabile a Runtime perchè cablato nei metadati. Il servizio SqlServer di aruba purtroopo crea le tabelle in uno schema che ha lo stesso nome dell'utente (per esempio MSSql123).  Quindi un edmx generato in locale a partire da tabelle definite nello schema dbo non fuzionerà. Vi sono due possibili Soluzioni: In locale definisco le tabelle di sviluppo nello stesso schema in cui saranno sul Sql di Aruba. CREATE SCHEMA  MSSql123 GO CREATE TABLE [MSSql123].NomeTabella] ( ... ......); Impongo che i metadati non vengano inseriti nella dll, ed edito a mano i tre file xml di metadati sostituendo dbo con lo schema in uso su aruba og