Share via


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

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

Nota

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 BeginOperationNameo , 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 para BeginOperationName, o aplicativo também deve ligar 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 Description
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 usado para chamar BeginOperationName em vez de concluir em um 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 usa parâmetros adicionais específicos da operação, como uma matriz de bytes para armazenar bytes lidos de um arquivo, o objeto e o AsyncCallback 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 lançar exceções, as exceções serão lançadas antes que a operação assíncrona seja iniciada. Se o BeginOperationName método lança exceções, o método de retorno de chamada não é 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 retira quaisquer parâmetros de exclusão 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 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 EndOperationName método. 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.

Nota

Para qualquer um dos cenários indefinidos, os implementadores devem considerar lançar InvalidOperationException.

Nota

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:

Consulte também