Partajați prin


Funcție concomitentă

Se aplică pentru: planșă de lucru apps Aplicații bazate pe model

Evaluează simultan mai multe formule între ele.

Descriere

Funcția Concurent permite evaluarea simultană a mai multor formule specificate în cadrul aceleiași proprietăți dacă au conector sau apeluri Dataverse. În mod normal, mai multe formule sunt evaluate prin înlănțuirea lor împreună cu operatorul (punct şi virgulă) ;, care o evaluează pe fiecare formulă secvențial. Cu funcția Concurrent, aplicația va evalua simultan toate formulele dintr-o proprietate chiar și după utilizarea operatorului ;. Această concurență îi va ajuta pe utilizatori să aștepte mai puțin pentru același rezultat.

În proprietatea OnStart aplicației dvs., utilizați Concurrent pentru a îmbunătăți performanța atunci când aplicația încarcă date. Când apelurile de date nu încep până la terminarea apelurilor anterioare, aplicația trebuie să aștepte suma tuturor timpurilor de solicitare. Dacă apelurile de date încep în același timp, aplicația trebuie să aștepte doar cel mai lung timp de solicitare. Browserele web îmbunătățesc adesea performanța efectuând apeluri de rețea concomitent.

Nu puteți prezice ordinea în care formulele din funcția Concurrent încep și sfârșesc evaluarea. Formulele din cadrul funcției Concurrent nu ar trebui să conțină dependențe de alte formule din aceeași funcție Concurrent și Power Apps arată o eroare dacă încercați. Din interior, puteți prelua în siguranță dependențe legate de formule din afara funcției Concurrent deoarece se vor finaliza înainte ca funcția Concurrent să înceapă. Formulele după funcția Concurrent pot lua în siguranță dependențe legate de formulele din interior: toate se vor finaliza înainte de funcția Concurrent se finalizează și trece la următoarea formulă dintr-un lanț (dacă utilizați operatorul ;). Fiți atent la dependențele subtile ale comenzii dacă apelați la funcții sau metode de serviciu care au efecte secundare.

Puteți înlănțui formule împreună cu operatorul ; în cadrul unui argument la Concurrent. De exemplu, Concurrent( Set( a, 1 ); Set( b, a+1 ), Set( x, 2 ); Set( y, x+2 ) ) evaluează Set( a, 1 ); Set( b, a+1 ) simultan cu Set( x, 2 ); Set( y, x+2 ). În acest caz, dependențele din formule sunt în regulă: a va fi setat înainte de b și x va fi setat înainte de y.

În funcție de dispozitivul sau browserul în care rulează aplicația, doar câteva formule ar putea fi de fapt evaluate simultan. Concurrent utilizează funcțiile disponibile și nu se va finaliza până la finalizarea tuturor formulelor.

Dacă activați Gestionarea erorilor la nivel de formulă (în setări complexe), prima eroare întâlnită în ordinea argumentelor este returnată Concurrent; în caz contrar, necompletat este returnat. Dacă toate formulele reușesc, true este returnat. Dacă o formulă nu reușește, restul formulei se oprește, dar alte formule continuă să se evalueze.

Poți să folosești Concurrent numai în formule comportamentale.

Sintaxă

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

  • Formulă(le) - Obligatoriu. Formule de evaluat concomitent. Trebuie să furnizați cel puțin două formule.

Exemple

Se încarcă datele mai repede

  1. Creați o aplicație și adăugați patru surse de date din Microsoft Dataverse, SQL Server sau SharePoint.

    Acest exemplu folosește patru tabele din baza de date Adventure Works eșantion din SQL Azure. După ce creați baza de date, conectați-vă la ea din Power Apps folosind numele serverului complet calificat (de exemplu, srvname.database.windows.net):

    Conectați-vă la o bază de date Adventure Works în Azure.

  2. Adăugați un control Button, apoi setați-i proprietatea OnSelect la următoarea formulă:

    ClearCollect( Product, '[SalesLT].[Product]' );
    ClearCollect( Customer, '[SalesLT].[Customer]' );
    ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' );
    ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )
    
  3. În Microsoft Edge sau Google Chrome, activați instrumentele pentru dezvoltatori pentru a monitoriza traficul de rețea în timp ce aplicația este în funcțiune.

  4. (opțional) Activați reglarea rețelei pentru a exagera efectele acestei comparații.

  5. În timp ce țineți apăsată tasta Alt, selectați butonul, apoi urmăriți traficul în rețea.

    Instrumentele arată patru solicitări efectuate în serie, care sunt similare cu acest exemplu. Timpii reali au fost eliminați, deoarece vor varia foarte mult. Graficul arată că fiecare apel începe după ce s-a terminat ultimul:

    Graficul privind durata călătoriei pentru patru solicitări de rețea, fiecare începând după ce ultima se încheie, acoperind întregul interval de timp.

  6. Salvați, închideți și redeschideți aplicația.

    Power Apps memorează datele în cache, astfel încât selectarea din nou a butonului nu va genera neapărat patru solicitări noi. De fiecare dată când doriți să testați performanța, închideți și redeschideți aplicația. Dacă ați activat reglarea rețelei, se recomandă să o dezactivați până când sunteți gata pentru un alt test.

  7. Adăugați un al doilea control Button, apoi setați proprietatea OnSelect la această formulă:

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

    Rețineți că ați adăugat aceleași apeluri ClearCollect la primul buton, dar sunt încadrate într-o funcție Concurrent și sunt separate prin virgule de data aceasta.

  8. Ștergeți monitorul de rețea din browser.

  9. Dacă ați folosit reglarea rețelei înainte, activați-o din nou.

  10. În timp ce țineți apăsată tasta Alt, selectați al doilea buton, apoi urmăriți traficul în rețea.

    Instrumentele arată patru solicitări efectuate simultan, care sunt similare cu acest exemplu. Din nou, timpii reali au fost eliminați, deoarece vor varia foarte mult. Graficul arată că toate apelurile încep cam la aceeași oră și nu așteaptă ca apelul anterior să se finalizeze:

    Graficul privind durata călătoriei pentru patru solicitări de rețea, toate cele patru începând împreună, acoperind aproximativ jumătate din intervalul de timp.

    Aceste grafice se bazează pe aceeași scală. Utilizând Concurrent, ați redus la jumătate intervalul total de timp necesar ca aceste operațiuni să se finalizeze.

  11. Salvați, închideți și redeschideți aplicația.

Condiție de rulare

  1. Adăugați o conexiune la serviciul Microsoft Translator pentru aplicația dvs.

  2. Adăugați un control Intrare text și redenumiți-l TextInput1 dacă are un nume diferit.

  3. Adăugați un control Buton, apoi setați-i proprietatea OnSelect la următoarea formulă:

    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. Adăugați un control Tabel de date și setați proprietatea sa Elemente la Rezultate.

  5. În fila Proprietăți din panoul din dreapta, selectați Editare câmpuri pentru a deschide panoul Câmpuri.

  6. În lista de câmpuri, bifați caseta de selectare pentru fiecare câmp pentru a le afișa pe toate în tabelul de date.

  7. (opțional) Glisați câmpul Intrare în partea de sus a listei și glisați câmpul FrenchFaster în partea de jos a listei.

    Lista câmpurilor din colecția Rezultate.

  8. În controlul Intrare text, tastați sau inserați o frază de tradus.

  9. În timp ce țineți apăsată tasta Alt, selectați butonul de mai multe ori pentru a umple tabelul.

    Timpii sunt afișați în milisecunde.

    Afișarea tabelului de date care conține rezultatele traducerii șirului „Hello World” în franceză și germană. Uneori traducerea franceză este mai rapidă decât cea în germană, iar uneori este invers.

    În unele cazuri, traducerea în franceză este mai rapidă decât traducerea în germană și invers. Ambele încep în același timp, dar una este returnată înaintea celeilalte din mai multe motive, inclusiv latența rețelei și procesarea din partea serverului.

    Ar putea apărea o condiție de rulare dacă aplicația ar depinde mai întâi de o singură traducere care se finalizează mai întâi. Din fericire, semnalizatorii Power Apps indică cele mai multe dependențe de sincronizare pe care le poate detecta.