Agentes Assíncronos

Um agente assíncrono (ou apenas agente) é um componente de aplicativo que funciona de forma assíncrona com outros agentes para resolver tarefas de computação maiores. Pense em um agente como uma tarefa que tem um ciclo de vida definido. Por exemplo, um agente pode ler dados de um dispositivo de entrada/saída (como o teclado, um arquivo em disco ou uma conexão de rede) e outro agente pode executar uma ação nesses dados à medida que eles se tornam disponíveis. O primeiro agente usa mensagem Em aprovação para informar ao segundo agente que mais dados estão disponíveis. O agendador de tarefas Runtime de Simultaneidade fornece um mecanismo eficiente para permitir que os agentes bloqueiem e produzam cooperativamente sem exigir uma preempção menos eficiente.

A Biblioteca de Agentes define a classe concurrency::agent para representar um agente assíncrono. agent é uma classe abstrata que declara o método virtual concurrency::agent::run. O método run executa a tarefa que é realizada pelo agente. Como run é abstrato, você deve implementar esse método em cada classe que você deriva de agent.

Ciclo de Vida do Agente

Os agentes têm um ciclo de vida definido. A enumeração concurrency::agent_status define os vários estados de um agente. A ilustração a seguir é um diagrama de estado que mostra como os avançam progridem de um estado para outro. Nesta ilustração, linhas sólidas representam métodos que você chama de seu aplicativo; linhas pontilhadas representam métodos chamados do runtime.

Agent State Diagram.

A tabela a seguir descreve cada estado na enumeração agent_status.

Estado do Agente Descrição
agent_created O agente não foi agendado para execução.
agent_runnable O runtime está agendando o agente para execução.
agent_started O agente foi iniciado e está em execução.
agent_done O agente foi concluído.
agent_canceled O agente foi cancelado antes de entrar no estado started.

agent_created é o estado inicial de um agente, agent_runnable e agent_started são os estados ativos, e, agent_done e agent_canceled são os estados terminais.

Use o método concurrency::agent::status para recuperar o estado atual de um objeto agent. Embora o método status seja seguro de simultaneidade, o estado do agente pode ser alterado quando o método status retorna. Por exemplo, um agente pode estar no estado agent_started quando você chamar o método status, mas movido para o estado agent_done logo após o retorno do método status.

Métodos e Recursos

A tabela a seguir mostra alguns dos métodos importantes que pertencem à classe agent. Para obter mais informações sobre todos os métodos de classe agent, consulte Classe agent.

Método Descrição
start Agenda o objeto agent para execução e o define com o estado agent_runnable.
run Executa a tarefa a ser realizada pelo objeto agent.
done Muda um agente para o estado agent_done.
cancel Se o agente não tiver sido iniciado, esse método cancelará a execução do agente e o definirá com o estado agent_canceled.
status Recupera o estado atual do objeto agent.
wait Aguarda que o objeto agent insira o estado agent_done ou agent_canceled.
wait_for_all Aguarda que todos os objetos agent fornecidos insiram o estado agent_done ou agent_canceled.
wait_for_one Aguarda que pelo menos um dos objetos agent fornecidos insira o estado agent_done ou agent_canceled.

Depois de criar um objeto de agente, chame o método concurrency::agent::start para agendá-lo para execução. O runtime chama o método run depois que ele agenda o agente e o define com o estado agent_runnable.

O runtime não gerencia exceções geradas por agentes assíncronos. Para mais informações sobre o tratamento de exceção, consulte Tratamento de exceção.

Exemplo

Para obter um exemplo que mostra como criar um aplicativo básico baseado em agente, consulte Passo a passo: Criando um aplicativo baseado em agente.

Confira também

Biblioteca de agentes assíncronos