Funciones asincrónicas definidas por el usuario
Hace referencia a: Excel 2013 | Office 2013 | Visual Studio
Microsoft Excel 2013 puede llamar a funciones definidas por el usuario de forma asincrónica. Llamar a funciones de forma asincrónica puede mejorar el rendimiento al permitir que se ejecuten varios cálculos al mismo tiempo. Al ejecutar funciones definidas por el usuario en un clúster de cálculo, llamar a funciones asincrónicamente permite usar varios equipos para realizar los cálculos.
Cuándo usar funciones asincrónicas definidas por el usuario
Algunas funciones definidas por el usuario deben esperar a los recursos externos. Mientras esperan, se bloquea el subproceso de cálculo de Excel. En Excel 2013, las funciones definidas por el usuario se pueden ejecutar de forma asincrónica. Esto libera el subproceso de cálculo para ejecutar otros cálculos mientras espera la función definida por el usuario.
En Excel 2007, los programadores podrían ejecutar varias funciones definidas por el usuario al mismo tiempo mediante el aumento del número de subprocesos usados en los cálculos de varios subprocesos. Este método tiene inconvenientes principalmente porque el número de subprocesos es una configuración con ámbito en una aplicación y no se puede controlar en el nivel de una sola función o un complemento.
Los programadores deben usar llamadas de función asincrónicas definidas por el usuario cuando la función debe esperar a los recursos externos. Por ejemplo, una función que envía una solicitud SOAP a través de Internet debe esperar a que la red entregue la solicitud, el servidor remoto para completar la solicitud y la red para devolver el resultado. En este caso, no se produce ninguna computación significativa y Excel puede continuar con otros cálculos.
Los programadores también pueden usar funciones asincrónicas definidas por el usuario cuando una función envía solicitudes a un clúster de proceso. En este caso, no solo hay latencia de red que esperar, sino que el clúster puede ejecutar llamadas independientes en servidores independientes. Al no esperar a que finalice cada llamada, las llamadas se pueden superponer para mejorar el rendimiento. En algunos casos, esta mejora es significativa.
Nota:
Las funciones definidas por el usuario no se pueden registrar como asincrónicas y seguras para clústeres.
Escritura de una función asincrónica definida por el usuario
Las funciones asincrónicas definidas por el usuario deben realizar un seguimiento de un identificador y usarlo al informar a Excel de que la llamada a la función ha finalizado. Una función asincrónica definida por el usuario se divide en dos partes. La primera pieza es el punto de entrada udf estándar, que iniciará una segunda operación asincrónica independiente. Las devoluciones de llamada a Excel deben realizarse durante el punto de entrada de UDF. La primera parte de inicio de la función devolverá el control de su subproceso de cálculo a Excel, que continuará el cálculo. Una vez completada la segunda operación asincrónica, debe volver a llamar a Excel y proporcionar a Excel su resultado.
Nota:
Los argumentos pasados a la UDF que necesite la parte asincrónica, la función debe copiarse en profundidad porque Excel libera estos argumentos cuando se devuelve el punto de entrada udf.
Excel proporciona un conjunto de eventos que un complemento XLL puede usar para administrar el ciclo de vida de las llamadas UDF asincrónicas. Estos eventos indican que Excel ha terminado con cálculos o que el cálculo se ha cancelado.
Declaración de una función asincrónica
Debe declarar funciones asincrónicas definidas por el usuario como asincrónicas cuando se registran. Esto se realiza agregando un parámetro que apunta a una estructura de XLOPER12, representada por "X" en la cadena de tipo de registro, en cualquier lugar de la lista de parámetros udf. Excel usa este parámetro para pasar el identificador de llamada asincrónico. El complemento XLL debe pasar el identificador de llamada asincrónico y el resultado de la función a Excel cuando el resultado esté listo. Además, el tipo de valor devuelto de la UDF debe ser void, designado por ">" como el primer carácter de la cadena de tipo. El tipo de valor devuelto es void porque la parte sincrónica de la UDF no devuelve un valor a Excel. En su lugar, el complemento XLL devuelve un valor de forma asincrónica a través de una devolución de llamada.
Puede declarar funciones asincrónicas como seguras para subprocesos y, a continuación, la parte sincrónica de la UDF se usa en una actualización multiproceso.
En el ejemplo de código siguiente se muestra una función asincrónica definida por el usuario registrada mediante ">QX" como cadena de tipo de registro:
void MyAsyncUDF(LPXLOPER12 arg1, LPXLOPER12 pxAsyncHandle)
{
…
}
Devolver valores
Cuando el resultado de la llamada asincrónica está listo, el complemento XLL devuelve el resultado a Excel realizando una devolución de llamada de tipo xlAsyncReturn.
xlAsyncReturn es la única devolución de llamada que puede usar en subprocesos que no son de cálculo durante la actualización. Por lo tanto, la parte asincrónica de una UDF asincrónica no debe realizar ninguna otra devolución de llamada.
Administración de eventos
A partir de Excel 2010, las XLL pueden recibir eventos diseñados para administrar el ciclo de vida de la función asincrónica. Para obtener más información, consulte Control de eventos.