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’essere PeriodicTask, DelayedTask o LongRunningTask 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 metodo Start() sull’attività (nell’esempio, myTask.Start()).

  • Terminazione dell’attività nel metodo Stop(), tramite invocazione del metodo Dispose().

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 richiesto

  • true = 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.

Vedi anche

Riferimenti

Costruttori di attività asincrone