Visão geral da programação assíncrono
Uma operação assíncrono que utiliza o IAsyncResult padrão de design é implementada sistema autônomo dois métodos chamados ComeçarOperationName e participanteOperationName que começam e terminam a operação assíncrono OperationName respectivamente.Por exemplo, a FileStream classe fornece o BeginRead e EndRead métodos para ler bytes assíncrona de um arquivo. Esses métodos implementam a versão assíncrono do Read método.
Depois de chamar ComeçarOperationName, um aplicativo pode continuar executando as instruções no thread de chamada, enquanto a operação assíncrono ocorre em um thread diferente.Cada telefonar para ComeçarOperationName, o aplicativo também deve chamar participanteOperationName para obter os resultados da operação.
The ComeçarMétodo de OperationName começa a operação assíncrono OperationName e retorna um objeto que implementa o IAsyncResult interface. IAsyncResult objetos armazenam informações sobre uma operação assíncrono. A tabela a seguir mostra informações sobre uma operação assíncrono.
Membro |
Descrição |
---|---|
Um objeto específico do aplicativo opcional que contém informações sobre a operação assíncrono. |
|
A WaitHandle que pode ser usado para bloquear a execução de aplicativos até que a operação assíncrono for concluída. |
|
Um valor que indica se a operação assíncrono foi concluída no thread usado para chamar ComeçarOperationName em vez de conclusão em uma separada ThreadPool segmento. |
|
Um valor que indica se a operação assíncrono foi concluída. |
A ComeçarMétodo de OperationName usa declarados na assinatura da versão síncrono do método quaisquer parâmetros passados por valor ou referência.Quaisquer parâmetros de saída não fazem parte do ComeçarAssinatura do método OperationName.The ComeçarAssinatura do método OperationName também inclui dois parâmetros adicionais.O primeiro define um AsyncCallback delegado que referencia um método que é chamado quando a operação assíncrono for concluída. O chamador pode especificar null (Nothing no Visual Basic) se não desejar um método chamado quando a operação for concluída. O segundo parâmetro adicional é um objeto definido pelo usuário.Este objeto pode ser usado para passar informações de estado específicos do aplicativo para o método chamado quando a operação assíncrono for concluída.If a ComeçarMétodo de OperationName usa parâmetros específicos de operação adicionais, sistema autônomo, por exemplo, uma matriz de byte para armazenar sistema autônomo byte lidos de um arquivo, a AsyncCallback e o objeto de estado do aplicativo são sistema autônomo parâmetros no últimos a ComeçarAssinatura do método OperationName.
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íncrono for iniciada.Se o ComeçarOperationName método lança exceções, o método de retorno de chamada não é invocado.
The participanteMétodo de OperationName termina a operação assíncrono OperationName.O valor retornado do participanteMétodo de OperationName é do mesmo tipo retornado pela sua contraparte assíncrono e específico para a operação assíncrono.Por exemplo, a 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. The participanteOperationName método leva qualquer check-out ou ref parâmetros declarados na assinatura da versão síncrono do método.Juntamente com os parâmetros do método síncrono, a participanteMétodo de OperationName também inclui um IAsyncResult parâmetro. Os chamadores devem passar a instância retornada pela telefonar correspondente para ComeçarOperationName.
Se a operação assíncrono é representado pelo IAsyncResult objeto não foi concluída quando participanteChamado OperationName , participanteOperationName bloqueia o segmento de chamada até que a operação assíncrono seja concluída.Exceções lançadas por operação assíncrono são lançadas do participanteMétodo de OperationName.O efeito de chamar o participanteMétodo de OperationName várias vezes com o mesmo IAsyncResult não foi definido. Da mesma forma, chamar o participanteMétodo de OperationName com um IAsyncResult que não retornou a começar relacionada método também não está definido.
Observação: |
---|
Para qualquer um dos 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íncrono concluída, definindo IsCompleted como true, chamando o método de retorno de chamada assíncrono (se foi especificado) e sinalização de AsyncWaitHandle. |
aplicativo desenvolvedores tem várias opções de design para acessar os resultados da operação assíncrono.A escolha correta depende se o aplicativo tem instruções que podem ser executados enquanto a operação é concluída.Se um aplicativo não pode executar qualquer trabalho adicional até receber os resultados da operação assíncrono, o aplicativo deve bloco até que os resultados estejam disponível.Para bloco até que uma operação assíncrono seja concluída, você pode usar uma das seguintes abordagens:
De telefonarparticipanteOperationName do thread principal do aplicativo, bloqueando a execução de aplicativos até que a operação foi concluída.Para obter um exemplo que ilustra essa técnica, consulte Bloqueando a execução do aplicativo ao final de uma operação assíncrono.
Use o AsyncWaitHandle para bloco execução de aplicativos até que uma ou mais operações sejam concluídas. Para obter um exemplo que ilustra essa técnica, consulte Bloqueando aplicativo execução com uma AsyncWaitHandle.
Os aplicativos que não precisam ser bloqueados enquanto a operação assíncrono for concluída podem usar uma das seguintes abordagens:
Chamada seletiva para status de conclusão da operação, verificando o IsCompleted propriedade periodicamente e chamada participanteOperationName quando a operação é concluída.Para obter um exemplo que ilustra essa técnica, consulte sondagem de status de uma operação assíncrono.
Usar um AsyncCallback delegado para especificar um método seja chamado quando a operação é concluída. Para obter um exemplo que ilustra essa técnica, consulte Usando um delegado AsyncCallback para finalizar uma operação assíncrono.
Chamando métodos síncrono assincronamente