I Cloud Service di Windows Azure consentono due tipologie di applicazioni che possiamo ospitare ed eseguire all'interno delle macchine virtuali: web e worker role. Abbiamo già visto nello script #310, come tale distinzione sta solo nel decidere se necessitiamo di un sito IIS, poiché possiamo eseguire codice in background su entrambi i ruoli.
Il concetto di role fa naturalmente pensare di inserire una sola attività nel worker role, ma ci sono situazioni in cui il codice da eseguire è così banale, oppure che le esigenze non sono ancora tali da giustificare più macchine per eseguire altrettanti worker role. In questo caso, possiamo predisporre le nostre attività in più assembly o in più componenti, in modo da tenerli ben distinti e facili da utilizzare con ruoli differenti o assieme su uno stesso ruolo.
Nello script seguente ipotizziamo di rappresentare tutti i nostri componenti di lavoro con un'interfaccia.
public interface IWorkerAgent
{
void Run();
void Stop();
}L'interfaccia definisce un metodo Run che, allo stesso modo di un worker role, nella sua implementazione deve ciclare o usare timer in base alle sue esigenze, come nell'esempio.
public class WorkerAgent1 : IWorkerAgent
{
private bool cancel;
public void Run()
{
// Continuo fino a quando OnStop non viene chiamato
while (!cancel)
{
// TODO: faccio qualcosa
// Aspetto un minuto
Thread.Sleep(TimeSpan.FromMinutes(1));
}
}
public void OnStop()
{
cancel = true;
}
}Definiti i vari componenti possiamo optare per usarne uno per ogni worker role, oppure usarli contemporaneamente in un'unica istanza. Per farlo è necessario bloccare il thread principale del ruolo e creare n thread per ogni componente da avviare.
public class WebRole : RoleEntryPoint
{
private Thread[] threads;
private WorkerAgent1[] agents;
public override void Run()
{
// Preparo i componenti da avviare
agents = new[] {
new WorkerAgent1()
};
// Creo i thread per ogni componente
threads = new Thread[agents.Length];
for (int x = 0; x < agents.Length; x++)
{
threads[x] = new Thread(agents[x].Run);
threads[x].IsBackground = true;
threads[x].Start();
}
// Aspetto che tutti i componenti abbiano finito
foreach (Thread t in threads)
t.Join();
}
public override void OnStop()
{
try
{
// Segnalo di fermarsi
foreach (IWorkerAgent a in agents)
a.Stop();
// Dò il tempo di fermare l'attività
Thread.Sleep(1000);
// Forzo abortendo i thread
foreach (Thread t in threads)
t.Abort();
}
catch (Exception)
{}
base.OnStop();
}
}Come possiamo vedere creiamo una lista dei componenti e una dei thread associati, aspettandoli per non far terminare il metodo principale Run. Nel caso di Stop, invece, notifichiamo ogni agent e abortiamo i thread per essere sicuri che si fermino.
Questa tecnica è comoda quando si vuole ottimizzare le risorse impiegate sulla piattaforma Windows Azure, ma ha il punto debole di non offrire scalabilità, se non è stata pensata su ogni componente. Creare due istanze dello stesso worker role, moltiplicherebbe anche i componenti che lavorano, dandoci risultati inattesi. In questo caso, allora, sarebbe meglio valutare l'adozione di un worker role per ogni componente.
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Interagire con Azure DevOps tramite MCP Server
Utilizzare @property per animare nativamente un oggetto HTML tramite CSS
Controllare la velocità di spostamento su una pagina HTML
Ridurre il reflow ottimizzando il CSS
Usare il metodo nameof con un tipo generico in C# 14
Gestire progetti NPM in .NET Aspire
Ottimizzare gli indici con Automatic Index Compaction in Azure SQL Database
Definire il colore di una scrollbar HTML tramite CSS
Proteggere l'endpoint dell'agente A2A delle Logic App
Gestione opzioni colonna nella Blazor QuickGrid
Recuperare le subissue e il loro stato di completamento in GitHub
Abilitare il rolling update su Azure Functions flex consumption
I più letti di oggi
- Scopri i nostri nuovi libri su ASP.NET 4.0, C# 4 e Visual Basic 2010: in offerta lancio al 20% di sconto!
- Windows 7 RC per abbonati MSDN e Technet, anche in versione Server
- Windows 7 e Windows Server 2008 R2 RC al download libero
- Utilizzare QuickGrid di Blazor con Entity Framework
- Resi noti i prezzi di Windows 7: in italiano dal 22 ottobre
- Usare Refit e Polly in Blazor per creare client affidabili e fortemente tipizzati
- Visual Studio 2010 e .NET Framework 4.0: beta 2 e data di release RTM
- Generare velocemente pagine CRUD in Blazor con QuickGrid
- Migliorare i tempi di risposta di GPT tramite lo streaming endpoint in ASP.NET Core
- Disponibile la beta 1 del .NET Framework 4.0 e di Visual Studio 2010




