Eseguire codice in modo asincrono¶
Attività asincrone
In alcuni progetti può essere necessario eseguire codice C# in modo asincrono, per esempio a intervalli di tempo regolari, oppure in momenti precisi, oppure eseguire attività impegnative a livello di tempo e/o di risorse computazionali senza disturbare il flusso di funzionamento del progetto.
Per ottenere questi funzionamenti è necessario creare delle attività asincrone, tramite cui eseguire il codice desiderato. Q Studio fornisce delle specifiche classi C# che espongono i costruttori utili a creare attività asincrone.
Nota
i costruttori sono basati sulla classe C# System.Threading.Tasks.Task
del framework .NET (fare riferimento a questa pagina), che rappresenta un’attività asincrona.
Le classi disponibili sono le seguenti:
PeriodicTask
, per creare un’attività che esegue codice a intervalli di tempo regolari.DelayedTask
, per creare attività con cui eseguire codice dopo un tempo di ritardo.LongRunningTask
, per creare attività impegnative a livello di tempo e/o di risorse computazionali.
Per riferimenti sui costruttori vedere Costruttori di attività asincrone.
Terminazione e annullamento di un’attività
Un’attività può essere terminata o annullata a runtime. Quando si termina un’attività, essa viene eliminata e non è possibile eseguirla nuovamente. Quando si cancella un’attività, essa viene fermata ma è possibile rieseguirla in un secondo momento.
Approccio tipico per creare, eseguire e terminare un’attività asincrona
Fare riferimento all’esempio seguente:
public override void Start()
{
myTask = new PeriodicTask(IncrementVariable, 1000, LogicObject)
myTask.Start();
}
public override void Stop()
{
myTask.Dispose();
}
private void IncrementVariable()
{
variable1.Value = variable1.Value + 1;
}
private PeriodicTask myTask;
Questo approccio prevede i seguenti passaggi:
Definizione di una variabile di istanza privata nella classe C# contenuta nel NetLogic (nell’esempio,
private PeriodicTask myTask;
). La classe di questa variabile dev’esserePeriodicTask
,DelayedTask
oLongRunningTask
a seconda del tipo di attività da creare.Definizione di un metodo che l’attività deve eseguire (nell’esempio,
IncrementVariable()
).Creazione dell’attività. Per farlo, all’interno del metodo
Start()
nella classe C# contenuto nel NetLogic, si inizializza la variabile di istanza privata (nell’esempio,myTask
) tramite il costruttore della classe (nell’esempio,PeriodicTask
).Nota
il costruttore prevede diversi argomenti a seconda della classe a cui appartiene. Vedere Costruttori di attività asincrone.
Esecuzione dell’attività non appena viene inizializzato il NetLogic a runtime. Per farlo, all’interno del metodo
Start()
nella classe C# contenuto nel NetLogic, si invoca il metodoStart()
sull’attività (nell’esempio,myTask.Start()
).Terminazione dell’attività nel metodo
Stop()
, tramite invocazione del metodoDispose()
.
Terminare un’attività
Ogni attività asincrona termina automaticamente quando viene rimosso il nodo padre del NetLogic. Si consiglia comunque, come da buona prassi di programmazione, di esplicitare la terminazione dell’attività all’interno del metodo Stop()
, tramite invocazione del metodo Dispose()
, come nell’esempio seguente:
public override void Stop()
{
myTask.Dispose();
}
Avvertimento
L’invocazione del metodo Dispose()
su un’attività asincrona è bloccante finché il codice eseguito dall’attività non restituisce il controllo al chiamante (tramite controllo dello stato del task o per completamento dell’attività).
Rendere annullabile un’attività
Un’attività può essere annullata soltanto se nel metodo che esegue si gestisce adeguatamente, di solito con istruzioni condizionali, il valore restituito dalla lettura della sua proprietà IsCancellationRequested
, che può assumere i seguenti valori:
false
= annullamento non richiestotrue
= annullamento richiesto
Per usare la proprietà all’interno del metodo, è necessario indicare l’attività come argomento dello stesso metodo, specificandone il tipo, come nell’esempio seguente, in cui myTask
è l’attività e ProcessScvFile()
è il metodo che esegue:
private void ProcessCsvFile(LongRunningTask myTask)
{
... // Code to execute
}
Per un esempio completo vedere Costruttore LongRunningTask(action, executingNode).
Annullare un’attività
Invocare il metodo Cancel()
sull’attività, come nell’esempio seguente:
myTask.Cancel();
Il metodo imposta il valore della proprietà IsCancellationRequested
dell’attività su True
.