Elaborazioni con timeout … gli Execution Constraints

In molti casi, si rende necessario eseguire un’elaborazione entro un certo intervallo di tempo, definendo un timeout di fine esecuzione; se l’elaborazione non viene conclusa entro il timeout prefissato, viene gestita la corrispondente condizione di errore.

Il .Net Framework, per numerose classi, mette a disposizione dei metodi che eseguono determinate elaborazioni per le quali è possibile impostare un timeout. Purtroppo, nel .Net Micro Framework, non esiste il medesimo supporto nella maggior parte delle situazioni.

Per questo motivo, è stato introdotto il concetto degli Execution Constraints, attraverso i quali è possibile monitorare se una certa elaborazione sia completata o meno in un determinato intervallo di tempo. Il tempo di esecuzione è monitorato da un background thread. Al completamento dell’elaborazione, il monitoring viene arrestato ed il constraint viene “disinstallato”.

La classe utilizzata è la ExecutionConstraint che mette a disposizione l’unico metodo statico Install() che prevede I seguenti parametri :

  • timeout : timeout dell’operazione in millisecondi;
  • priority : la priorità del thread di monitoring (attualmente sembra che il micro framework non tenga conto di questo parametro);

Di seguito è illustrato un esempio di applicazione :

ExecutionConstraint.Install(1000, 0);
// elaborazione
ExecutionConstraint.Install(-1, 0);

Attraverso la prima chiamata ad Install(), definiamo un timeout massimo di 1000 ms (1 sec) per tutto il codice che verrà eseguito sino alla successiva chiamata dello stesso metodoInstall(), per il quale il parametro di timeout impostato a –1 ha il significato di “disinstallare” il monitoring.

Nel caso in cui, l’elaborazione non viene completata entro il timeout prefissato, viene sollevata una ConstraintException.
In base a quanto detto, un buon pattern di utilizzo sarà il seguente :
try
{
    ExecutionConstraint.Install(1000, 0);
    // elaborazione
}
catch (ConstraintException cEx)
{
    // elaborazione non terminata entro timeout
}
finally
{
    ExecutionConstraint.Install(-1, 0);
}
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s