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
Eliminare record doppi in Sql Server
Gestione CSS in Blazor con .NET 9
Raggruppare risorse in .NET Aspire
Personalizzare le pagine di errore su Azure App Service
Utilizzare i command service nei test con .NET Aspire
Montare Azure Blob Storage su Linux con BlobFuse2
Conoscere il rendering Server o WebAssembly a runtime in Blazor
Evitare memory leaks nelle closure JavaScript
Collegare applicazioni server e client con .NET Aspire
Dallo sviluppo locale ad Azure con .NET Aspire
Integrare modelli AI in un workflow di GitHub
Utilizzare Hybrid Cache in .NET 9
I più letti di oggi
- Disponibile al download la versione finale di Internet Explorer 9
- Costruire il web del futuro con HTML5: la nostra guida rapida
- Utilizzare @property per animare nativamente un oggetto HTML tramite CSS
- Utilizzo delle stepped value functions nel CSS
- Impostare automaticamente l'altezza del font tramite CSS


