Partager via


Concurrent Fonction

S’applique à : Applications canevas basées sur des modèles

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

Description

La Concurrent fonction permet à plusieurs formules spécifiées dans la même propriété d’être évaluées en même temps s’ils ont des appels de connecteur ou 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 Concurrent fonction, l’application évalue toutes les formules dans une propriété simultanément, même après l’utilisation de l’opérateur ; . Cette concurrence permet aux utilisateurs d’attendre moins pour le même résultat.

Dans la propriété OnStart de votre application, utilisez Concurrent cette option pour améliorer les performances lorsque l’application charge des données. 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 dans la Concurrent fonction commencent et terminent l’évaluation. Les formules de la Concurrent fonction ne doivent pas contenir de dépendances sur d’autres formules au sein de la même Concurrent fonction, et Power Apps affiche une erreur si vous essayez. À partir de là, vous pouvez prendre en toute sécurité des dépendances sur les formules en dehors de la Concurrent fonction, car elles se terminent avant le démarrage de la Concurrent fonction. Les formules après la Concurrent fonction peuvent prendre en toute sécurité des dépendances sur les formules au sein de : elles se terminent toutes avant la fin de la Concurrent fonction et passent à 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 chaîner des formules avec l’opérateur ; dans un argument à 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 ) simultanément avec Set( x, 2 ) ; Set( y, x+2 ). 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 se termine pas tant que toutes les formules n’ont pas été évaluées.

Si vous activez la gestion des erreurs au niveau de la formule (dans les paramètres avancés), la première erreur rencontrée dans l’ordre d’argument est retournée Concurrent; sinon, vide 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 les formules de comportement.

Syntaxe

Concurrent( Formula1, Formula2 [, ...] )

  • Formules – 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 temps réels ont été supprimés car ils varient sauvagement. 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 qu’ils sont encapsulés dans une Concurrent fonction et séparés par des virgules cette fois.

  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 temps réels ont été supprimés, car ils varient sauvagement. Le graphique montre que tous les appels commencent en même temps et n’attendent pas que la précédente se termine :

    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. En utilisant Concurrent, vous avez réduit de moitié le temps total nécessaire à 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 commencent en même temps, mais l’un retourne avant l’autre pour différentes raisons, notamment la latence 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.