Visão geral de programação assíncrona

Uma operação assíncrona que utiliza o IAsyncResult padrão de design é implementada como dois métodos chamados BeginOperationName e EndOperationName que comece e termine a operação assíncrona OperationName respectivamente. Por exemplo, o FileStream classe fornece o BeginRead e EndRead métodos para ler de forma assíncrona bytes do arquivo. A versão assíncrona de implementar esses métodos de Read método.

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

Começando uma operação assíncrona

O começarOperationName método começa a operação assíncrona OperationName e retorna um objeto que implementa o IAsyncResult interface. IAsyncResultobjetos 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

A WaitHandle que pode ser usado para bloquear a execução de aplicativos até que a operação assíncrona for concluída.

CompletedSynchronously

Um valor que indica se a operação assíncrona concluída no thread usado para chamar começarOperationName em vez de conclusão em uma separada ThreadPool segmento.

IsCompleted

Um valor que indica se a operação assíncrona foi concluída.

A começarOperationName método utiliza quaisquer parâmetros declarados na assinatura da versão síncrona do método que são passados por valor ou referência. Quaisquer parâmetros de saída não são parte do começarOperationName assinatura do método. O começarOperationName assinatura do método também inclui dois parâmetros adicionais. A primeira delas define um AsyncCallback representante que referencia um método que é chamado quando a operação assíncrona for concluída. O chamador pode especificar null (Nothing em Visual Basic) se quiser um método chamado 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ífico do aplicativo para o método invocado quando a operação assíncrona for concluída. Se um começarOperationName método usa parâmetros específicos da operação adicionais, como, por exemplo, uma matriz de bytes para armazenar os bytes lidos de um arquivo, o AsyncCallback e o objeto de estado do aplicativo são parâmetros na últimos a começarOperationName assinatura do método.

BeginOperationName devolve o controle para o segmento chamado imediatamente. Se o começarOperationName método lança exceções, as exceções são lançadas antes da operação assíncrona for iniciada. Se o começarOperationName método lança exceções, o método de retorno de chamada não é invocado.

Final de uma operação assíncrona

O EndOperationName método termina a operação assíncrona OperationName. O valor de retorno de EndOperationName método é o mesmo tipo retornado pela 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 a partir 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 ocupa qualquer ou parâmetros ref declarado na assinatura da versão síncrona do método. Além de para os 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 começarOperationName.

Se a operação assíncrona representado pela IAsyncResult de objeto não foi concluída quando EndOperationName é chamado, EndOperationName bloqueia o segmento de chamada até que a operação assíncrona for concluída. Exceções geradas pela operação assíncrona são jogadas da EndOperationName método. O efeito da chamada a EndOperationName método várias vezes com o mesmo IAsyncResult não está definido. Da mesma forma, chamar o EndOperationName método com um IAsyncResult que não foi retornado pela começar relacionada método também não está definido.

Observação

Para ambos os cenários indefinidos, implementadores devem considerar a lançar InvalidOperationException.

Observação

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

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

Os aplicativos não precisam ser bloqueados enquanto a operação assíncrona for concluída podem usar uma das seguintes abordagens:

Consulte também

Conceitos

Chamando métodos síncronos assincronamente

Usando um delegado AsyncCallback e um objeto de estado

Outros recursos

Padrões de Design de programação assíncrona