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
Controllare la telemetria con .NET Aspire
Utilizzare il metodo ExceptBy per eseguire operazione di sottrazione tra liste
Aggiornare a .NET 9 su Azure App Service
Ricevere notifiche sui test con Azure Load Testing
Eseguire script pre e post esecuzione di un workflow di GitHub
Utilizzare EF.Constant per evitare la parametrizzazione di query SQL
Usare i servizi di Azure OpenAI e ChatGPT in ASP.NET Core con Semantic Kernel
Gestione dei nomi con le regole @layer in CSS
Rinnovare il token di una GitHub App durante l'esecuzione di un workflow
Ordine e importanza per @layer in CSS
Abilitare automaticamente il force push di un gruppo su Azure DevOps
Evitare memory leaks nelle closure JavaScript
I più letti di oggi
- Segnala questa pagina ad un amico
- SQL Server 2005 in beta 2
- Gestione CSS in Blazor con .NET 9
- Documentare i servizi REST con Swagger e OpenAPI con .NET 9
- Gestione ciclo di vita in .NET Aspire
- Calcolare il resto di una divisione
- ecco tutte le novità pubblicate sui nostri siti questa settimana: https://aspit.co/wkly buon week-end!