Compartilhar via


Funções assíncronas definidas pelo usuário

Aplica-se a: Excel 2013 | Office 2013 | Visual Studio

Microsoft Excel 2013 pode chamar funções definidas pelo usuário de forma assíncrona. Chamar funções de forma assíncrona pode melhorar o desempenho permitindo que vários cálculos sejam executados ao mesmo tempo. Quando executar funções definidas pelo usuário em um cluster de cálculo, chamando funções de forma assíncrona permite que vários computadores sejam usados para concluir os cálculos.

Quando usar funções assíncronas definidas pelo usuário

Algumas funções definidas pelo usuário devem aguardar recursos externos. Enquanto esperam, o thread de cálculo do Excel é bloqueado. No Excel 2013, as funções definidas pelo usuário podem ser executadas de forma assíncrona. Isso libera o thread de cálculo para executar outros cálculos enquanto a função definida pelo usuário aguarda.

No Excel 2007, os programadores poderiam executar várias funções definidas pelo usuário ao mesmo tempo aumentando o número de threads usados em recalculações de vários threads. Esse método tem desvantagens principalmente porque o número de threads é uma configuração com escopo para um aplicativo e não pode ser controlada no nível de uma única função ou de um suplemento.

Os programadores devem usar chamadas de função assíncronas definidas pelo usuário quando a função deve aguardar recursos externos. Por exemplo, uma função que envia uma solicitação SOAP pela Internet deve aguardar para que a rede entregue a solicitação, o servidor remoto para concluir a solicitação e a rede para retornar o resultado. Nesse caso, não há nenhuma computação significativa ocorrendo e o Excel pode continuar com outros cálculos.

Os programadores também podem usar funções assíncronas definidas pelo usuário quando uma função está enviando solicitações para um cluster de computação. Nesse caso, não há apenas latência de rede a ser aguardada, mas o cluster pode executar chamadas separadas em servidores separados. Ao não aguardar a conclusão de cada chamada, as chamadas podem ser sobrepostas para melhorar o desempenho. Em alguns casos, essa melhoria é significativa.

Observação

As funções definidas pelo usuário não podem ser registradas como assíncronas e seguras de cluster.

Escrever uma função assíncrona definida pelo usuário

Funções assíncronas definidas pelo usuário devem acompanhar um identificador e usar esse identificador ao informar ao Excel que a chamada de função está concluída. Uma função assíncrona definida pelo usuário é dividida em duas partes. A primeira peça é o ponto de entrada UDF padrão, que iniciará uma segunda operação assíncrona separada. Os retornos de chamada no Excel devem ser feitos durante o ponto de entrada da UDF. A primeira parte de inicialização da função retornará o controle de seu thread de cálculo para o Excel, que continuará a ser o cálculo. Quando a segunda operação assíncrona for concluída, ela deverá chamar de volta para o Excel e fornecer o resultado ao Excel.

Observação

Todos os argumentos passados para a UDF que são necessários pela parte assíncrona, a função deve ser copiada profundamente porque o Excel libera esses argumentos quando o ponto de entrada UDF retorna.

O Excel fornece um conjunto de eventos que um suplemento XLL pode usar para gerenciar o ciclo de vida de chamadas assíncronas da UDF. Esses eventos indicam que o Excel está concluído com cálculos ou que o cálculo foi cancelado.

Declarando uma função assíncrona

Você deve declarar funções assíncronas definidas pelo usuário como assíncronas quando elas são registradas. Isso é executado adicionando um parâmetro que aponta para uma estrutura de XLOPER12, representada por "X" na cadeia de caracteres de tipo de registro, em qualquer lugar da lista de parâmetros UDF. O Excel usa esse parâmetro para passar o identificador de chamada assíncrono. O suplemento XLL deve passar o identificador de chamada assíncrono e o resultado da função de volta ao Excel quando o resultado estiver pronto. Além disso, o tipo de retorno da UDF deve ser nulo, designado por ">" como o primeiro caractere na cadeia de caracteres de tipo. O tipo de retorno é nulo porque a parte síncrona da UDF não retorna um valor para o Excel. Em vez disso, o suplemento XLL retorna um valor de forma assíncrona por meio de um retorno de chamada.

Você pode declarar funções assíncronas como thread-safe e, em seguida, a parte síncrona da UDF é usada em um recálculo de vários threads.

O exemplo de código a seguir mostra uma função assíncrona definida pelo usuário registrada usando ">QX" como a cadeia de caracteres de tipo de registro:

void MyAsyncUDF(LPXLOPER12 arg1, LPXLOPER12 pxAsyncHandle)
{
…
}

Retornando valores

Quando o resultado da chamada assíncrona estiver pronto, o suplemento XLL retorna o resultado ao Excel executando um retorno de chamada do tipo xlAsyncReturn.

xlAsyncReturn é o único retorno de chamada que você pode usar em threads que não são de cálculo durante o recálculo. Portanto, a parte assíncrona de uma UDF assíncrona não deve executar nenhum outro retorno de chamada.

Manipulando eventos

A partir do Excel 2010, as XLLs podem receber eventos projetados para gerenciar o ciclo de vida da função assíncrona. Para obter mais informações, consulte Manipulação de Eventos.

Confira também