O que é o AsyncCallback?

Qual é o uso do AsyncCallback e por que devemos usá-lo?

Quando o método async finaliza o processamento, o método AsyncCallback é chamado automaticamente, onde as instruções de pós-processamento podem ser executadas. Com essa técnica, não há necessidade de pesquisar ou aguardar a conclusão do segmento async .

Aqui está mais alguma explicação sobre o uso do retorno de Async :

Modelo de retorno de chamada : O modelo de retorno de chamada exige que especifiquemos um método para o retorno de chamada e inclua qualquer estado que precisamos no método de retorno de chamada para concluir a chamada. O modelo de retorno de chamada pode ser visto no exemplo a seguir:

 static byte[] buffer = new byte[100]; static void TestCallbackAPM() { string filename = System.IO.Path.Combine (System.Environment.CurrentDirectory, "mfc71.pdb"); FileStream strm = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 1024, FileOptions.Asynchronous); // Make the asynchronous call IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, new AsyncCallback(CompleteRead), strm); } 

Neste modelo, estamos criando um novo delegado AsyncCallback , especificando um método para chamar (em outro thread) quando a operação for concluída. Além disso, estamos especificando algum object que podemos precisar como o estado da chamada. Para este exemplo, estamos enviando o object stream porque precisaremos chamar EndRead e fechar o stream.

O método que criamos para ser chamado no final da chamada seria algo como isto:

 static void CompleteRead(IAsyncResult result) { Console.WriteLine("Read Completed"); FileStream strm = (FileStream) result.AsyncState; // Finished, so we can call EndRead and it will return without blocking int numBytes = strm.EndRead(result); // Don't forget to close the stream strm.Close(); Console.WriteLine("Read {0} Bytes", numBytes); Console.WriteLine(BitConverter.ToString(buffer)); } 

Outras técnicas são Wait-até-done e Polling .

Modelo Wait-Until-Done O modelo wait-até-done permite que você inicie a chamada assíncrona e realize outro trabalho. Quando o outro trabalho estiver concluído, você poderá tentar encerrar a chamada e ela será bloqueada até que a chamada assíncrona seja concluída.

 // Make the asynchronous call strm.Read(buffer, 0, buffer.Length); IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null); // Do some work here while you wait // Calling EndRead will block until the Async work is complete int numBytes = strm.EndRead(result); 

Ou você pode usar alças de espera.

 result.AsyncWaitHandle.WaitOne(); 

Modelo de pesquisa O método de pesquisa é semelhante, com a exceção de que o código pesquisará o IAsyncResult para ver se ele foi concluído.

 // Make the asynchronous call IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null); // Poll testing to see if complete while (!result.IsCompleted) { // Do more work here if the call isn't complete Thread.Sleep(100); } 

Pense desta maneira. Você tem algumas operações que você gostaria de executar em paralelo. Você habilitaria isso usando encadeamentos que são executados de forma assíncrona. Este é um mecanismo de fogo e esqueça.

Mas algumas situações exigem um mecanismo onde você pode triggersr e esquecer, mas precisa de notificação quando a operação for concluída. Para isso você usaria uma chamada assíncrona de volta.

A operação é assíncrona, mas retorna quando a operação é concluída. A vantagem disso é que você não precisa esperar pela operação até que ela seja concluída. Você está livre para executar outras operações e, portanto, seu segmento não está bloqueado.

Um exemplo disso seria uma transferência em segundo plano de um arquivo grande. Enquanto a transferência está em andamento, você não quer realmente impedir que o usuário faça outras operações. Quando a transferência estiver concluída, o processo chamará você de volta em um método asynchronous, onde você provavelmente poderá abrir uma checkbox de mensagem que diz “Transferência concluída”.

AsyncCallbacks são usados ​​para especificar uma function para chamar quando uma operação assíncrona é concluída. Por exemplo, se você estivesse executando uma operação de E / S, chamaria BeginRead em um stream e passaria um representante AsyncCAllback. A function seria chamada quando a operação de leitura fosse concluída.

Para mais informações, veja:

  • Visão geral do padrão asynchronous baseado em evento
  • Usando um representante AsyncCallback para finalizar uma operação assíncrona