Tra le novità più importanti di Windows Phone 7.1 è presente la possibilità di eseguire task in background, con l'applicazione attiva o spenta, dando la possibilità di aggiornare tile, eseguire attività di rete, sincronizzare e così via. E' bene sapere che l'applicazione e il task vengono eseguiti in due processi diversi, ma condividono lo stesso deployment e quindi lo stesso isolated storage per poter memorizzare file, immagini o database.
Si tratta di un dettaglio non di poco conto, perché l'applicazione e il task potrebbero essere eseguiti contemporaneamente e accedere a risorse condivise, come appunto l'isolated storage. In questo caso è importante quindi sincronizzare l'accesso ai dati, in modo che solo un codice per volta intervenga su di esso, evitando conflitti. Poiché i processi sono differenti, non è possibile utilizzare le normali keyword lock (c#) e SyncLock (VB), perché si basano su riferimenti di oggetti. E' stata introdotta quindi una nuova classe di nome Mutex, presa in prestito dal .NET Framework, per rappresentare un semaforo cross process.
Nello script seguente viene mostrato un tipico snippet di codice da utilizzare per racchiudere l'accesso allo storage, da usare sia nell'applicazione che nel task.
using (Mutex mutex = new Mutex(false, "accessFile"))
{
if (mutex.WaitOne(TimeSpan.FromSeconds(5)))
{
// Accesso esclusivo, nessuna concorrenza
try
{
WriteFileToStorage();
}
finally
{
// Rilascio il mutex
mutex.ReleaseMutex();
}
}
else
{
// Accesso non ottenuto in cinque secondi
}
}Del codice si può notare come il semaforo si identifichi tramite stringa, perciò è possibile usarne più di uno, purché si condivida la stessa chiave. Il parametro booleano indica se il thread corrente deve acquisire la ownership, ma in questo caso non si vuole questo effetto. Il metodo WaitOne permette di aspettare che il semaforo si liberi indicando facoltativamente il tempo massimo di attesa. Nell'esempio, passati i 5 secondi si ottiene true se il semaforo è stato rilasciato entro il tempo massimo, oppure false in caso contrario. Una volta ottenuto l'accesso si detiene il mutex e si è al sicuro da accessi concorrenti. Terminate le operazioni è necessario quindi rilasciare il mutex, così da permette ad un altro thread/processo di accedere.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Supporto nativo a JSON in SQL Server 2025
Impostare il tipo di supporto dei campi Json in Entity Framework con Sql Server
Usare la parola chiave field per semplificare la scrittura di proprietà in C#
Evitare la compressione degli artefatti in un workflow di GitHub
Eseguire i pre-commit hook di git con dependabot
Creare comandi nella dashboard .NET Aspire
Personalizzare le pagine di errore su Azure App Service
Integrare Agenti A2A in Azure API Management
Dallo sviluppo locale ad Azure con .NET Aspire
Disabilitare le run concorrenti di una pipeline di Azure DevOps
Interazione con ReconnectModal in Blazor
Migrare applicazioni legacy nel cloud con Azure App Service Managed Instance




