Condividi tramite


Agenti asincroni

Un agente asincrono, o semplicemente agente, è un componente dell'applicazione che funziona in modo asincrono con altri agenti per risolvere le attività di elaborazione più grandi. Considerare un agente come un'attività con un ciclo di vita stabilito. Ad esempio, un agente potrebbe leggere i dati da un dispositivo di input/output, come tastiera, file su disco o connessione di rete, e un altro agente potrebbe eseguire un'azione su tali dati non appena diventano disponibili. Il primo agente utilizza il passaggio dei messaggi per informare il secondo agente della disponibilità di altri dati. L'Utilità di pianificazione del runtime di concorrenza fornisce un meccanismo efficiente per consentire agli agenti di bloccare e restituire un oggetto in modo cooperativo senza richiederne l'annullamento che risulta meno efficace.

La libreria di agenti definisce la classe Concurrency::agent per rappresentare un agente asincrono. agent è una classe astratta che dichiara il metodo virtuale Concurrency::agent::run. Il metodo run esegue l'attività eseguita dall'agente. Poiché il metodo run è astratto, è necessario implementarlo in ogni classe derivata da agent.

Ciclo di vita degli agenti

Gli agenti hanno un ciclo di vita stabilito. L'enumerazione Concurrency::agent_status definisce i vari stati di un agente. Nell'illustrazione seguente viene rappresentato un diagramma di stato che mostra l'avanzamento degli agenti da uno stato all'altro. In questa illustrazione, le linee continue rappresentano i metodi chiamati dall'applicazione, mentre le linee tratteggiate rappresentano i metodi chiamati dal runtime.

Diagramma dello stato dell'agente

Nella tabella seguente viene descritto ogni stato dell'enumerazione agent_status.

Stato dell'agente

Descrizione

agent_created

L'esecuzione dell'agente non è stata pianificata.

agent_runnable

Il runtime sta pianificando l'esecuzione dell'agente.

agent_started

L'agente è stato avviato ed è in esecuzione.

agent_done

L'agente è stato completato.

agent_canceled

L'agente è stato annullato prima dell'attivazione dello stato started.

agent_created è lo stato iniziale di un agente, agent_runnable e agent_started sono gli stati attivi, mentre agent_done e agent_canceled sono gli stati finali.

Utilizzare il metodo Concurrency::agent::status per recuperare lo stato corrente di un oggetto agent. Sebbene il metodo status sia indipendente dalla concorrenza, lo stato dell'agente può già essere cambiato quando il metodo status viene restituito. Un agente potrebbe trovarsi, ad esempio, nello stato agent_started quando viene chiamato il metodo status, ma essere passato allo stato agent_done subito dopo la restituzione del metodo status.

Metodi e funzionalità

Nella tabella seguente vengono illustrati alcuni dei metodi principali appartenenti alla classe agent. Per ulteriori informazioni su tutti i metodi della classe agent, vedere Classe agent.

Metodo

Descrizione

start

Pianifica l'esecuzione dell'oggetto agent impostandolo sullo stato agent_runnable.

run

Esegue l'attività che deve essere eseguita dall'oggetto agent.

done

Modifica lo stato di un agente in agent_done.

cancel

Se l'agente non è stato avviato, questo metodo annulla l'esecuzione dell'agente impostandolo sullo stato agent_canceled.

status

Recupera lo stato corrente dell'oggetto agent.

wait

Attende che l'oggetto agent passi allo stato agent_done o agent_canceled.

wait_for_all

Attende che tutti gli oggetti agent forniti passino allo stato agent_done o agent_canceled.

wait_for_one

Attende che almeno uno degli oggetti agent forniti passi allo stato agent_done o agent_canceled.

Dopo avere creato un oggetto agente, chiamare il metodo Concurrency::agent::start per pianificarne l'esecuzione. Il runtime chiama il metodo run dopo aver pianificato l'agente e averlo impostato sullo stato agent_runnable.

Il runtime non gestisce le eccezioni generate dagli agenti asincroni. Per ulteriori informazioni sulla gestione delle eccezioni e sugli agenti, vedere Gestione delle eccezioni nel runtime di concorrenza.

Esempio

Per un esempio in cui viene illustrato come creare un'applicazione di base basata sugli agenti, vedere Procedura dettagliata: creazione di un'applicazione basata sugli agenti.

Vedere anche

Concetti

Libreria di agenti asincroni