Share via


Agenti asincroni

Un agente asincrono (o solo agente) è un componente dell'applicazione che funziona in modo asincrono con altri agenti per risolvere attività di calcolo più grandi. Si consideri un agente come un'attività con un ciclo di vita impostato. Ad esempio, un agente potrebbe leggere i dati da un dispositivo di input/output (ad esempio la tastiera, un file su disco o una connessione di rete) e un altro agente potrebbe eseguire un'azione su tali dati non appena diventa disponibile. Il primo agente usa il passaggio di messaggi per informare il secondo agente che sono disponibili più dati. L'utilità di pianificazione dell'attività Runtime di concorrenza fornisce un meccanismo efficiente per consentire agli agenti di bloccare e restituire in modo cooperativo senza richiedere una precedenza meno efficiente.

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

Ciclo di vita dell'agente

Gli agenti hanno un ciclo di vita impostato. L'enumerazione concurrency::agent_status definisce i vari stati di un agente. La figura seguente è un diagramma di stato che mostra come gli agenti progredisce da uno stato a un altro. In questa illustrazione le linee solide rappresentano i metodi che si chiamano dall'applicazione; le linee tratteggiate rappresentano i metodi chiamati dal runtime.

Agent State Diagram.

La tabella seguente descrive ogni stato nell'enumerazione agent_status .

Stato agente Descrizione
agent_created L'agente non è stato pianificato per l'esecuzione.
agent_runnable Il runtime pianifica l'esecuzione dell'agente.
agent_started L'agente è stato avviato ed è in esecuzione.
agent_done L'agente è terminato.
agent_canceled L'agente è stato annullato prima di entrare nello started stato.

agent_created è lo stato iniziale di un agente agent_runnable e agent_started sono gli stati attivi e agent_doneagent_canceled sono gli stati del terminale.

Usare il metodo concurrency::agent::status per recuperare lo stato corrente di un agent oggetto. Anche se il status metodo è indipendente dalla concorrenza, lo stato dell'agente può cambiare in base al momento in cui il status metodo restituisce. Ad esempio, un agente potrebbe trovarsi nello agent_started stato quando si chiama il status metodo , ma spostato nello agent_done stato subito dopo la restituzione del status metodo.

Metodi e funzionalità

La tabella seguente illustra alcuni dei metodi importanti che appartengono alla agent classe . Per altre informazioni su tutti i metodi di agent classe, vedere Classe agente.

Metodo Descrizione
start Pianifica l'oggetto per l'esecuzione agent e lo imposta sullo agent_runnable stato.
run Esegue l'attività che deve essere eseguita dall'oggetto agent .
done Sposta un agente nello agent_done stato .
cancel Se l'agente non è stato avviato, questo metodo annulla l'esecuzione dell'agente e lo imposta sullo agent_canceled stato.
status Recupera lo stato corrente dell'oggetto agent .
Aspettare Attende che l'oggetto agent entri nello agent_done stato o agent_canceled .
wait_for_all Attende che tutti gli oggetti forniti entrino agent nello agent_done stato o agent_canceled .
wait_for_one Attende che almeno uno degli oggetti forniti agent entri nello agent_done stato o agent_canceled .

Dopo aver creato un oggetto agente, chiamare il metodo concurrency::agent::start per pianificarlo per l'esecuzione. Il runtime chiama il run metodo dopo la pianificazione dell'agente e lo imposta sullo agent_runnable stato.

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

Esempio

Per un esempio che illustra come creare un'applicazione basata su agente di base, vedere Procedura dettagliata: Creazione di un'applicazione basata su agente.

Vedi anche

Libreria di agenti asincroni