Condividi tramite


Funzione Concurrent

Si applica a: App canvas App basate su modello

Valuta più formule contemporaneamente.

Descrizione

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

Nella proprietà OnStart dell'app usare Concurrent per migliorare le prestazioni durante il caricamento dei dati da parte dell'app. 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 prevedere l'ordine in cui le formule all'interno della funzione Concurrent avviano e terminano la valutazione. Le formule all'interno della funzione Concurrent non devono contenere dipendenze in altre formule all'interno della stessa funzione Concurrent altrimenti Power Apps visualizza un errore. Dall'interno, è possibile accettare dipendenze in formule all'esterno della funzione Concurrent poiché vengono completate prima dell'inizio della funzione Concurrent. Le formule successive alla funzione Concurrent possono accettare all'interno dipendenze in formule: vengono tutte completate prima che la funzione Concurrent termini 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 tramite l'operatore ; in un argomento di 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 viene terminata fino a quando non vengono valutate tutte le formule.

Se si abilita Gestione errori a livello della formula nelle impostazioni avanzate, viene restituito da Concurrent il primo errore rilevato nell'ordine degli argomenti; in caso contrario, viene restituito blank. 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 [, ...] )

  • Formula(s): 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 perché variano notevolmente. 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 le stesse chiamate ClearCollect sono state aggiunte al primo pulsante, ma questa volta ne è stato eseguito il wrapping in una funzione Concurrent e sono separate da virgole.

  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. I tempi effettivi sono stati di nuovo rimossi perché variano notevolmente. Il grafico indica che tutte le chiamate iniziano nello stesso momento senza attendere il completamento della chiamata 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 dimezzata la quantità totale di tempo necessaria 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. Entrambe hanno inizio nello stesso momento, ma una viene restituita prima dell'altra per diversi motivi, tra cui la latenza di rete e l'elaborazione sul 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.