Condividi tramite


Funzione Concurrent

Si applica a: App canvas app basate su modello

Valuta più formule contemporaneamente.

Descrizione

La Concurrent funzione consente di valutare contemporaneamente più formule specificate all'interno della stessa proprietà se dispongono di chiamate connettore o Dataverse. In genere la valutazione di più colonne viene eseguita concatenandole con l'operatore ; (punto e virgola) che valuta ogni formula sequenzialmente. Con la Concurrent funzione , l'app valuterà tutte le formule all'interno di una proprietà simultaneamente anche dopo aver usato l'operatore ; . Questa concorrenza consente agli utenti di attendere meno per lo stesso risultato.

Nella proprietà OnStart dell'app usare Concurrent per migliorare le prestazioni quando l'app carica i dati. Quando le chiamate di dati non vengono avviate prima del completamento delle chiamate precedenti, l'app deve attendere per il tempo totale di tutte le richieste. Se le chiamate di dati vengono avviate contemporaneamente, l'app dovrà attendere solo il tempo della richiesta più lunga. I Web browser spesso migliorano le prestazioni eseguendo le chiamate di rete contemporaneamente.

Non è possibile stimare l'ordine in cui le formule all'interno della funzione iniziano e terminano la Concurrent valutazione. Le formule all'interno della Concurrent funzione non devono contenere dipendenze da altre formule all'interno della stessa Concurrent funzione e Power Apps visualizza un errore se si prova. Dall'interno, è possibile accettare in modo sicuro le dipendenze dalle formule all'esterno della Concurrent funzione perché vengono completate prima dell'avvio della Concurrent funzione. Le formule dopo che la Concurrent funzione può assumere in modo sicuro le dipendenze dalle formule all'interno: verranno tutte completate prima che la Concurrent funzione venga completata e passi alla formula successiva in una catena (se si usa l'operatore ; ). Se vengono chiamate funzioni o metodi con effetti collaterali, prestare particolare attenzione alle dipendenze di ordine.

È possibile concatenare le formule insieme all'operatore ; all'interno di un argomento a Concurrent. Ad esempio, Concurrent( Set( a, 1 ); Set( b, a+1 ), Set( x, 2 ); Set( y, x+2 ) valuta Set( a, 1 ); Set( b, a+1 ) contemporaneamente a Set( x, 2 ); Set( y, x+2 ). In questo caso le dipendenze all'interno delle formule sono corrette: a viene impostata prima di b e x viene impostata prima di y.

A seconda del dispositivo o browser in cui viene eseguita l'app, solo un numero limitato di formule può effettivamente essere valutato contemporaneamente. Concurrent usa le funzionalità disponibili e non terminerà fino a quando non vengono valutate tutte le formule.

Se si abilita la gestione degli errori a livello di formula (nelle impostazioni avanzate), viene restituito il primo errore nell'ordine degli argomenti da Concurrent. In caso contrario, viene restituito vuoto . Se tutte le formule hanno esito positivo, viene restituito true. Se una formula ha esito negativo, il resto della formula viene interrotto, mentre le altre formule continuano la valutazione.

È possibile usare Concurrent solo nelle formule di comportamento.

Sintassi

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

  • Formule – Obbligatorio. Formule da valutare contemporaneamente. È necessario specificare almeno due formule.

Esempi

Caricamento dei dati più rapido

  1. Creare un'app e aggiungere quattro origini dati da Microsoft Dataverse, SQL Server o SharePoint.

    In questo esempio vengono usate quattro tabelle del database di esempio Adventure Works in SQL Azure. Dopo aver creato il database, connettersi al database da Power Apps usando il nome server completo, ad esempio srvname.database.windows.net:

    Connettersi al database Adventure Works in Azure.

  2. Aggiungere un controllo Button e impostane la relativa proprietà OnSelect sulla formula seguente:

    ClearCollect( Product, '[SalesLT].[Product]' );
    ClearCollect( Customer, '[SalesLT].[Customer]' );
    ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' );
    ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )
    
  3. In Microsoft Edge o Google Chrome attivare gli strumenti per sviluppatori per monitorare il traffico di rete durante l'esecuzione dell'app.

  4. (facoltativo) Attivare la limitazione della larghezza di banda della rete per esagerare gli effetti di questo confronto.

  5. Tenendo premuto il tasto ALT, selezionare il pulsante e quindi controllare il traffico di rete.

    Gli strumenti visualizzano quattro richieste eseguite in serie, come nell'esempio. I tempi effettivi sono stati rimossi in quanto variano in modo selvaggio. Il grafico mostra che ogni chiamata viene avviata dopo che l'ultima è stata completata:

    Grafico del tempo delle quattro richieste di rete: ogni richiesta ha inizio dopo il completamento dell'ultima richiesta richiedendo l'intero intervallo di tempo.

  6. Salvare, chiudere e riaprire l'app.

    Poiché Power Apps memorizza i dati nella cache, se si seleziona nuovamente il pulsante non vengono necessariamente generate quattro nuove richieste. Ogni volta che si vuole testare le prestazioni, chiudere e riaprire l'app. Se è stata attivata la limitazione della larghezza di banda della rete, è possibile disattivarla fino a quando non si è pronti per un altro test.

  7. Aggiungere un secondo controllo Button e impostare la relativa proprietà OnSelect del controllo sulla formula seguente:

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

    Si noti che sono state aggiunte le stesse chiamate ClearCollect al primo pulsante, ma sono incluse in una Concurrent funzione e separate da virgole questa volta.

  8. Deselezionare il monitoraggio di rete nel browser.

  9. Se è stata usata in precedenza la limitazione della larghezza di banda della rete, riattivarla.

  10. Tenendo premuto il tasto ALT, selezionare il secondo pulsante e quindi controllare il traffico di rete.

    Gli strumenti visualizzano quattro richieste eseguite contemporaneamente, come nell'esempio. Anche in questo caso, i tempi effettivi sono stati rimossi in quanto variano in modo selvaggio. Il grafico mostra che tutte le chiamate iniziano contemporaneamente e non attendono il completamento di quella precedente:

    Grafico del tempo delle quattro richieste di rete che iniziano tutte contemporaneamente richiedendo circa la metà dell'intervallo di tempo.

    Questi grafici sono basati sulla stessa scala. Usando Concurrent, è stato dimezzato il tempo totale impiegato per il completamento di queste operazioni.

  11. Salvare, chiudere e riaprire l'app.

Race condition

  1. Aggiungere una connessione al servizio Microsoft Translator all'app.

  2. Aggiungere un controllo Text input e rinominarlo TextInput1 se ha un nome diverso.

  3. Aggiungi un controllo Button e impostane la proprietà OnSelect sulla formula seguente:

    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. Aggiungere un controllo Data table e impostare la relativa proprietà Items su Results.

  5. Nella scheda Proprietà del riquadro a destra selezionare Modifica campi per aprire il riquadro Campi.

  6. Nell'elenco dei campi selezionare la casella di controllo per ogni campo per visualizzarli tutti nella tabella di dati.

  7. (facoltativo) Trascinare il campo Input nella parte superiore dell'elenco e trascinare il campo FrenchFaster nella parte inferiore dell'elenco.

    Elenco dei campi nella raccolta dei risultati.

  8. Nel controllo Text input digitare o incollare una frase da tradurre.

  9. Tenere premuto ALT e selezionare il pulsante più volte per riempire la tabella.

    I tempi sono espressi in millisecondi.

    Visualizzazione della tabella dati contenente i risultati della traduzione della stringa

    In alcuni casi la traduzione francese è più rapida di quella tedesca e viceversa. Entrambi iniziano contemporaneamente, ma uno torna prima dell'altro per vari motivi, tra cui la latenza di rete e l'elaborazione lato server.

    Se l'app dipende dal fatto che una traduzione termini prima, si verifica una race condition. Fortunatamente, Power Apps contrassegna la maggior parte delle dipendenze di temporizzazione che è in grado di rilevare.