Partilhar via


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

Uma operação assíncrona que usa o padrão de design IAsyncResult é implementada como dois métodos chamados BeginOperationName e EndOperationName que iniciam e terminam, respectivamente, a operação assíncrona OperationName. Por exemplo, a FileStream classe 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

Começando com o .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 Padrão assíncrono baseado em tarefas (TAP).

Depois de chamar BeginOperationName, uma aplicação pode continuar a executar instruções na thread de chamada enquanto a operação assíncrona se realiza numa thread diferente. Para cada chamada para BeginOperationName, a aplicação 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 específico do aplicativo opcional 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 no thread que fez a chamada BeginOperationName em vez de ser concluída num thread separado 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. Quaisquer parâmetros de saída 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 pode especificar null (Nothing no Visual Basic) se 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 usar parâmetros específicos adicionais da operação, como uma matriz de bytes para armazenar bytes lidos de um ficheiro, o AsyncCallback e o objeto de estado da aplicação 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 lançar exceções, as exceções serão lançadas antes que a operação assíncrona seja iniciada. Caso o método BeginOperationName lance exceções, o método callback não será invocado.

Encerrando uma operação assíncrona

O EndOperationName método termina a operação assíncrona OperationName. O valor de retorno do EndOperationName método é o mesmo tipo retornado por sua contraparte síncrona 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 quaisquer parâmetros out ou ref declarados na assinatura da versão síncrona do mesmo. 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 IAsyncResult representada pelo 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 lançadas pela operação assíncrona são lançadas 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 EndOperationName método com um IAsyncResult que não foi retornado pelo método Begin relacionado também não é definido.

Observação

Para qualquer cenário indefinido, os implementadores deverão considerar lançar 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 foi 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:

Os aplicativos que não precisam bloquear enquanto a operação assíncrona é concluída podem usar uma das seguintes abordagens:

Ver também