Fonction Concurrent

S’applique à : Applications canevas Applications pilotées par modèle

Évalue plusieurs formules entre elles en même temps.

Description

La fonction Concurrent permet à plusieurs formules spécifiées dans la même propriété d’être évaluées en même temps si elles ont un connecteur ou des appels Dataverse. En général, l’opérateur ; (point-virgule) est utilisé pour lier plusieurs formules entre elles qui évalue ensuite chaque formule dans l’ordre. Avec la fonction Concurrent, l’application évalue simultanément toutes les formules d’une propriété même après avoir utilisé l’opérateur ;. Cette concurrence laisse patienter les utilisateurs moins longtemps pour le même résultat.

Dans la propriété OnStart de votre application, utilisez Concurrent pour accélérer le chargement des données dans l’application. Quand les appels de données ont lieu successivement, le délai d’attente de l’application est égal à la somme des durées de toutes les requêtes. Si les appels de données démarrent en même temps, le délai d’attente de l’application est réduit à la durée de la requête la plus longue. Pour améliorer les performances, les navigateurs web effectuent souvent des appels de réseau simultanées.

Vous ne pouvez pas prédire l’ordre dans lequel les formules de la fonction Concurrent démarrent et terminent l’évaluation. Les formules à l’intérieur de la fonction Concurrent ne doivent pas contenir de dépendances à d’autres formules se trouvant dans la même fonction Concurrent. Si c’est le cas, Power Apps affiche une erreur. À l’intérieur, vous pouvez accepter sans risque des dépendances à des formules situées hors de la fonction Concurrent, car elles seront terminées avant le démarrage de la fonction Concurrent. Les formules après la fonction Concurrent peuvent en toute sécurité accepter des dépendances à des formules dans la même fonction : elles seront toutes terminées avant la fin de la fonction Concurrent et son passage à la formule suivante dans une chaîne (si vous utilisez l’opérateur ;). Soyez attentif aux dépendances d’ordre subtiles si vous appelez des fonctions ou des méthodes de service qui ont des effets secondaires.

Vous pouvez lier des formules avec l’opérateur ; dans un argument de Concurrent. Par exemple, Concurrent( Set( a, 1 ); Set( b, a+1 ), Set( x, 2 ); Set( y, x+2 ) ) évalue Set( a, 1 ); Set( b, a+1 ) et Set( x, 2 ); Set( y, x+2 ) simultanément. Dans ce cas, les dépendances dans les formules ne posent aucun problème : a est défini avant b, et x avant y.

Selon l’appareil ou le navigateur sur lequel l’application s’exécute, il est possible que seules quelques formules soient évaluées simultanément. Concurrent utilise les fonctionnalités disponibles et ne s’achève qu’une fois toutes les formules évaluées.

Si vous activez Gestion des erreurs au niveau de la formule (dans les paramètres avancés), Concurrent retourne la première erreur rencontrée dans l’ordre des arguments ; sinon, blank est retourné. Si toutes les formules réussissent, true est retourné. Si une formule échoue, le reste de cette formule s’arrête, mais l’évaluation se poursuit pour les autres.

Vous ne pouvez utiliser Concurrent que dans des formules de comportement.

Syntaxe

Concurrent( Formule1, Formule2 [, ...] )

  • Formule(s) : obligatoire. Formules à évaluer simultanément. Vous devez fournir au moins deux formules.

Exemples

Chargement plus rapide des données

  1. Créez une application et ajoutez quatre sources de données à partir de Microsoft Dataverse, SQL Server ou SharePoint.

    Cet exemple utilise quatre tables de l’exemple de base de données Adventure Works sur SQL Azure. Connectez-vous à la base de données que vous venez de créer à partir de Power Apps en utilisant le nom complet du serveur (par exemple, srvname.database.windows.net) :

    Se connecter à la base de données Adventure Works dans Azure.

  2. Ajoutez un contrôle Button, puis définissez sa propriété OnSelect sur la formule suivante :

    ClearCollect( Product, '[SalesLT].[Product]' );
    ClearCollect( Customer, '[SalesLT].[Customer]' );
    ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' );
    ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )
    
  3. Dans Microsoft Edge ou Google Chrome, activez les outils de développement pour surveiller le trafic réseau pendant l’exécution de votre application.

  4. (facultatif) Activez la limitation de bande passante pour exagérer les effets de cette comparaison.

  5. Tout en maintenant la touche Alt enfoncée, sélectionnez le bouton, puis examinez le trafic réseau.

    Les outils montrent quatre requêtes exécutées en série, comme dans cet exemple. Les durées réelles ont été supprimées car elles peuvent varier énormément. Le graphe montre que chaque appel démarre une fois le précédent terminé :

    Graphe de temps des quatre requêtes réseau, chacune démarrant une fois la précédente terminée, couvrant tout l’intervalle de temps.

  6. Enregistrez l’application, fermez-la et rouvrez-la.

    Power Apps met en cache les données. Le fait de cliquer à nouveau sur le bouton n’engendre donc pas systématiquement quatre nouvelles requêtes. Chaque fois que vous souhaitez tester les performances, fermez votre application et rouvrez-la. Si vous avez activé la limitation de bande passante, nous vous conseillons de la désactiver jusqu’au prochain test.

  7. Ajoutez un deuxième contrôle Button, puis définissez sa propriété OnSelect avec la formule suivante :

    Concurrent(
        ClearCollect( Product, '[SalesLT].[Product]' ),
        ClearCollect( Customer, '[SalesLT].[Customer]' ),
        ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ),
        ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )
    )
    

    Notez que vous avez ajouté les mêmes appels ClearCollect au premier bouton, mais ils sont cette fois wrappés dans une fonction Concurrent et séparés par des virgules.

  8. Effacez le moniteur réseau dans le navigateur.

  9. Si vous utilisiez auparavant la limitation de bande passante, réactivez-la.

  10. Tout en maintenant la touche Alt enfoncée, sélectionnez le deuxième bouton, puis examinez le trafic réseau.

    Les outils montrent quatre requêtes exécutées simultanément, comme dans cet exemple. Là encore, les durées réelles ont été supprimées car elles peuvent varier énormément. Le graphe montre que tous les appels commencent à peu près en même temps dans la mesure où aucun appel n’attend que le précédent se termine pour commencer :

    Graphe de temps des quatre requêtes réseau, celles-ci démarrant ensemble, couvrant environ la moitié de l’intervalle de temps.

    Ces graphes sont basés sur la même échelle. L’utilisation de Concurrent vous permet de diviser par deux la durée de ces opérations.

  11. Enregistrez l’application, fermez-la et rouvrez-la.

Condition Race

  1. Ajoutez une connexion au service Microsoft Translator à votre application.

  2. Ajoutez un contrôle Text input et renommez-le TextInput1 s’il porte un autre nom.

  3. Ajoutez un contrôle Button, puis définissez sa propriété OnSelect sur la formule suivante :

    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
        }
    )
    
  4. Ajoutez un contrôle Data table et définissez sa propriété Items avec la valeur Results.

  5. Sous l’onglet Propriétés du volet droit, sélectionnez Modifier les champs pour ouvrir le volet Champs.

  6. Dans la liste des champs, cochez la case correspondant à chaque champ pour tout afficher dans la table de données.

  7. (facultatif) Faites glisser le champ Input vers le haut de la liste, puis faites glisser le champ FrenchFaster vers le bas de la liste.

    Liste des champs dans la collection Result.

  8. Dans le contrôle Text input, tapez ou collez une phrase à traduire.

  9. Tout en maintenant la touche Alt enfoncée, sélectionnez le bouton plusieurs fois pour remplir la table.

    Les durées sont affichées en millisecondes.

    Affichage de la table de données contenant les résultats de la traduction de la chaîne « Hello World » en français et en allemand. Parfois, la traduction française est plus rapide que la traduction allemande, et parfois c'est l'inverse.

    Dans certains cas, la traduction française est plus rapide que la traduction allemande et inversement. Les deux fonctions démarrent en même temps, mais l’une est retournée avant l’autre pour diverses raisons, notamment le temps de réponse du réseau et le traitement côté serveur.

    Si l’application attendait la fin d’une traduction avant de lancer la deuxième, il en résulterait une condition race. Heureusement, Power Apps signale la plupart des dépendances liées au temps qu’il peut détecter.