Función Concurrent
Se aplica a: Aplicaciones de Canvas Aplicaciones basadas en modelos
Evalúa varias fórmulas simultáneamente entre sí.
Descripción
La función Concurrent permite evaluar varias fórmulas especificadas dentro de la misma propiedad al mismo tiempo si tienen conector o llamadas de Dataverse. Normalmente, para evaluar varias fórmulas se encadenan con el operador ; (punto y coma), que evalúa secuencialmente cada fórmula. Con la función Concurrent, la aplicación evaluará todas las fórmulas de una misma propiedad simultáneamente incluso después de usar el operador ; . Esta simultaneidad ayudará a los usuarios a esperar menos por el mismo resultado.
En la propiedad OnStart de la aplicación, use Concurrent para mejorar el rendimiento cuando la aplicación carga los datos. Si las llamadas de datos no se inician hasta que terminan las llamadas anteriores, la aplicación debe esperar la suma de todos los tiempos de solicitud. Si las llamadas de datos se inician al mismo tiempo, la aplicación solo debe esperar el tiempo de solicitud más largo. Los exploradores web suelen mejorar el rendimiento al realizar las llamadas de red de forma simultánea.
No se puede predecir el orden en que las fórmulas de la función Concurrent inician y terminan la evaluación. Las fórmulas de la función Concurrent no deben contener dependencias en otras fórmulas de la misma función Concurrent y, si se intenta, Power Apps muestra un error. Desde dentro, es posible tomar dependencias en fórmulas de fuera de la función Concurrent con seguridad, puesto que se completan antes de que se inicie la función Concurrent. Las fórmulas de después de la función Concurrent pueden tomar dependencias en fórmulas de dentro con seguridad: todas se completan antes de que termine la función Concurrent y de que se mueva a la siguiente fórmula de una cadena (si se usa el operador ;). Esté atento a las dependencias de orden sutiles si está llamando a funciones o métodos de servicio con efectos secundarios.
Puede encadenar fórmulas con el operador ; dentro de un argumento Concurrent. Por ejemplo, Concurrent( Set( a, 1 ); Set( b, a+1 ), Set( x, 2 ); Set( y, x+2 ) ) evalúa Set( a, 1 ); Set( b, a+1 ) simultáneamente con Set( x, 2 ); Set( y, x+2 ). En este caso, las dependencias dentro de las fórmulas están bien: a se establece antes de b y x se establece antes de y.
Según el dispositivo o explorador en el que se ejecute la aplicación, es posible que solo un puñado de fórmulas se evalúen realmente de forma simultánea. Concurrente utiliza las capacidades disponibles y no finalizará hasta que se hayan evaluado todas las fórmulas.
Si habilita Administración de errores a nivel de fórmula (en Configuración avanzada), se devuelve el primer error detectado en el orden de los argumentos de Concurrent; en caso contrario, se devuelve blank. Si todas las fórmulas son correctas, se devuelve true. Si se produce un error en una fórmula, se detiene el resto de la fórmula, pero las demás fórmulas se siguen evaluando.
Solo puede usar Concurrent en fórmulas de comportamiento.
Sintaxis
Concurrente( Fórmula1, Fórmula2 [, ...] )
- Fórmulas – Obligatorio. Fórmulas que se van a evaluar de forma simultánea. Se deben proporcionar al menos dos fórmulas.
Ejemplos
Carga de datos más rápida
Cree una aplicación y agregue cuatro orígenes de datos de Microsoft Dataverse, SQL Server o SharePoint.
En este ejemplo se usan cuatro tablas de la base de datos de ejemplo Adventure Works en SQL Azure. Después de crear la base de datos, conéctese a ella desde Power Apps con el nombre de servidor completo (por ejemplo, srvname.database.windows.net):
Agregue un control Button y establezca su propiedad OnSelect en esta fórmula:
ClearCollect( Product, '[SalesLT].[Product]' ); ClearCollect( Customer, '[SalesLT].[Customer]' ); ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ); ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )
En Microsoft Edge o Google Chrome, active las herramientas de desarrollador para supervisar el tráfico de red mientras se ejecuta la aplicación.
(Opcional) Active el límite de red para exagerar los efectos de esta comparación.
Mientras mantiene presionada la tecla Alt, seleccione el botón y luego observe el tráfico de red.
Las herramientas muestran cuatro solicitudes realizadas en serie similares a este ejemplo. Se han quitado los tiempos reales, ya que van a variar mucho. El gráfico muestra que cada llamada se inicia una vez finalizada la última:
Guarde, cierre y vuelva a abrir la aplicación.
Power Apps almacena los datos en caché, por lo que al volver a seleccionar el botón no se realizan necesariamente cuatro nuevas solicitudes. Cada vez que quiera probar el rendimiento, cierre y vuelva a abrir la aplicación. Si ha activado el límite de red, puede desactivarlo hasta que esté listo para otra prueba.
Agregue un segundo control Button y establezca su propiedad OnSelect en esta fórmula:
Concurrent( ClearCollect( Product, '[SalesLT].[Product]' ), ClearCollect( Customer, '[SalesLT].[Customer]' ), ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ), ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' ) )
Observe que ha agregado las mismas llamadas ClearCollect al primer botón, pero que esta vez están encapsuladas en una función Concurrent y separadas por comas.
Desactive la supervisión de red en el explorador.
Si antes estaba usando el límite de red, vuelva a activarlo.
Mientras mantiene presionada la tecla Alt, seleccione el segundo botón y luego observe el tráfico de red.
Las herramientas muestran cuatro solicitudes realizadas de forma simultánea similares a este ejemplo. Una vez más, se han quitado los tiempos reales, ya que van a variar mucho. El gráfico muestra que todas las llamadas se inician aproximadamente al mismo tiempo y no esperan a que finalice la anterior:
Estos gráficos se basan en la misma escala. Al usar Concurrent, se ha reducido a la mitad la cantidad total de tiempo que estas operaciones han tardado en terminar.
Guarde, cierre y vuelva a abrir la aplicación.
Condición Race
Agregue una conexión al servicio Microsoft Traductor a su aplicación.
Agregue un control Text input y, si tiene otro nombre, cámbielo a TextInput1.
Agregue un control Button y establezca su propiedad OnSelect en esta fórmula:
Set( StartTime, Value( Now() ) ); Concurrent( Set( FRTrans, MicrosoftTranslator.Translate( TextInput1.Text, "fr" ) ); Set( FRTransTime, Value( Now() ) ), Set( DETrans, MicrosoftTranslator.Translate( TextInput1.Text, "de" ) ); Set( DETransTime, Value( Now() ) ) ); Collect( Results, { Input: TextInput1.Text, French: FRTrans, FrenchTime: FRTransTime - StartTime, German: DETrans, GermanTime: DETransTime - StartTime, FrenchFaster: FRTransTime < DETransTime } )
Agregue un control Data table y establezca su propiedad Items en Results.
En la pestaña Propiedades del panel derecho, seleccione Editar campos para abrir el panel Campos.
En la lista de campos, active la casilla de cada campo para mostrarlos todos en la tabla de datos.
(Opcional) Arrastre el campo Input a la parte superior de la lista y el campo FrenchFaster a la parte inferior.
En el control Text input, escriba o pegue una frase que quiera traducir.
Mientras mantiene presionada la tecla Alt, seleccione el botón varias veces para rellenar la tabla.
Las horas se muestran en milisegundos.
En algunos casos, la traducción al francés es más rápida que la traducción al alemán y viceversa. Ambas se inician al mismo tiempo, pero una se devuelve antes que la otra por diversos motivos, incluidos el procesamiento de servidor y la latencia de red.
Se produce una condición de carrera si la aplicación dependía de que una traducción terminara primero. Afortunadamente, Power Apps marca la mayoría de las dependencias de tiempo que puede detectar.