Compartilhar via


Modelo de programação assíncrona (APM)

Uma operação assíncrona que usa o IAsyncResult padrão de design é implementada como dois métodos nomeados BeginOperationName e EndOperationName que iniciam e encerram a operação assíncrona OperationName , respectivamente. Por exemplo, a classe FileStream fornece os métodos BeginRead e EndRead para ler bytes de um arquivo de forma assíncrona. Esses métodos implementam a versão assíncrona do Read método.

Observação

A partir do .NET Framework 4, a Biblioteca Paralela de Tarefas fornece um novo modelo para programação assíncrona e paralela. Para obter mais informações, consulte TPL (Biblioteca Paralela de Tarefas) e TAP (Padrão Assíncrono Baseado em Tarefa)).

Após a chamada BeginOperationName, um aplicativo pode continuar executando instruções no thread de chamada enquanto a operação assíncrona ocorre em um thread diferente. Para cada chamada a BeginOperationName, o aplicativo também deve chamar EndOperationName para obter os resultados da operação.

Iniciando uma operação assíncrona

O BeginOperationName método inicia a operação assíncrona OperationName e retorna um objeto que implementa a IAsyncResult interface. IAsyncResult os objetos armazenam informações sobre uma operação assíncrona. A tabela a seguir mostra informações sobre uma operação assíncrona.

Membro Descrição
AsyncState Um objeto opcional específico do aplicativo que contém informações sobre a operação assíncrona.
AsyncWaitHandle Um WaitHandle que pode ser usado para bloquear a execução do aplicativo até que a operação assíncrona seja concluída.
CompletedSynchronously Um valor que indica se a operação assíncrona foi concluída na linha de execução usada para chamar BeginOperationName, em vez de ser concluída em uma linha de execução separada ThreadPool.
IsCompleted Um valor que indica se a operação assíncrona foi concluída.

Um BeginOperationName método usa todos os parâmetros declarados na assinatura da versão síncrona do método que são passados por valor ou por referência. Os parâmetros externos não fazem parte da assinatura do BeginOperationName método. A BeginOperationName assinatura do método também inclui dois parâmetros adicionais. O primeiro deles define um AsyncCallback delegado que faz referência a um método que é chamado quando a operação assíncrona é concluída. O chamador poderá especificar null (Nothing no Visual Basic) se ele não quiser um método invocado quando a operação for concluída. O segundo parâmetro adicional é um objeto definido pelo usuário. Esse objeto pode ser usado para passar informações de estado específicas do aplicativo para o método invocado quando a operação assíncrona for concluída. Se um BeginOperationName método usa parâmetros adicionais específicos da operação, como uma matriz de bytes para armazenar bytes lidos de um arquivo, o AsyncCallback e o objeto de estado do aplicativo são os últimos parâmetros na assinatura do BeginOperationName método.

BeginOperationName retorna o controle para o thread de chamada imediatamente. Se o BeginOperationName método gerar exceções, as exceções serão geradas antes que a operação assíncrona seja iniciada. Se o BeginOperationName método gerar exceções, o método de retorno de chamada não será invocado.

Encerrando uma operação assíncrona

O EndOperationName método encerra a operação assíncrona OperationName. O valor retornado do EndOperationName método é o mesmo tipo retornado por seu equivalente síncrono e é específico para a operação assíncrona. Por exemplo, o EndRead método retorna o número de bytes lidos de um FileStream e o EndGetHostByName método retorna um IPHostEntry objeto que contém informações sobre um computador host. O EndOperationName método aceita os parâmetros out ou ref declarados na assinatura da versão síncrona do método. Além dos parâmetros do método síncrono, o EndOperationName método também inclui um IAsyncResult parâmetro. Os chamadores devem passar a instância retornada pela chamada correspondente para BeginOperationName.

Se a operação assíncrona representada pelo IAsyncResult objeto não tiver sido concluída quando EndOperationName for chamada, EndOperationName bloqueará o thread de chamada até que a operação assíncrona seja concluída. As exceções geradas pela operação assíncrona são geradas do método EndOperationName. O efeito de chamar o EndOperationName método várias vezes com o mesmo IAsyncResult não é definido. Da mesma forma, chamar o método EndOperationName com um IAsyncResult que não foi retornado pelo método Begin relacionado também não será definido.

Observação

Para qualquer um dos cenários indefinidos, os implementadores devem considerar a geração de InvalidOperationException.

Observação

Os implementadores desse padrão de design devem notificar o chamador de que a operação assíncrona foi concluída definindo IsCompleted como true, chamando o método de retorno de chamada assíncrono (se um tiver sido especificado) e sinalizando o AsyncWaitHandle.

Os desenvolvedores de aplicativos têm várias opções de design para acessar os resultados da operação assíncrona. A escolha correta depende se o aplicativo tem instruções que podem ser executadas enquanto a operação é concluída. Se um aplicativo não puder executar nenhum trabalho adicional até receber os resultados da operação assíncrona, o aplicativo deverá bloquear até que os resultados estejam disponíveis. Para bloquear até que uma operação assíncrona seja concluída, você pode usar uma das seguintes abordagens:

Aplicativos que não precisam ser bloqueados enquanto a operação assíncrona é concluída podem usar uma das seguintes abordagens:

Consulte também