Função Concurrent no PowerAppsConcurrent function in PowerApps

Avalia múltiplas fórmulas em simultâneo.Evaluates multiple formulas concurrently with one another.

DescriçãoDescription

A função Concurrent avalia múltiplas fórmulas ao mesmo tempo.The Concurrent function evaluates multiple formulas at the same time. Normalmente, várias fórmulas são avaliadas, relacionando-as em conjunto com o ; operador, que avalia cada sequencialmente por ordem.Normally, multiple formulas are evaluated by chaining them together with the ; operator, which evaluates each sequentially in order. Quando a aplicação executa operações em simultâneo, os utilizadores esperam menos tempo pelo mesmo resultado.When the app performs operations concurrently, users wait less for the same result.

Na propriedade OnStart da sua aplicação, utilize Concurrent para melhorar o desempenho quando a aplicação carrega dados.In the OnStart property of your app, use Concurrent to improve performance when the app loads data. Quando as chamadas de dados não são iniciadas até as chamadas anteriores serem concluídas, a aplicação tem de aguardar pela soma de todos os tempos de pedidos.When data calls don't start until the previous calls finish, the app must wait for the sum of all request times. Se as chamadas de dados forem iniciadas ao mesmo tempo, a aplicação só precisa de esperar pelo tempo do pedido mais longo.If data calls start at the same time, the app needs to wait only for the longest request time. O desempenho dos browsers é muitas vezes melhorado ao executar operações de dados em simultâneo.Web browsers often improve performance by performing data operations concurrently.

Não é possível prever a ordem pela qual as fórmulas dentro da função Concurrent são avaliadas.You can't predict the order in which formulas within the Concurrent function start and end evaluation. As fórmulas dentro da função Concurrent não devem conter dependências de outras fórmulas dentro da mesma função Concurrent. Se tal acontecer, o PowerApps apresentará um erro.Formulas within the Concurrent function shouldn't contain dependencies on other formulas within the same Concurrent function, and PowerApps shows an error if you try. Nessa função, pode utilizar dependências de fórmulas fora da função Concurrent com segurança porque as mesmas serão concluídas antes de a função Concurrent ser iniciada.From within, you can safely take dependencies on formulas outside the Concurrent function because they will complete before the Concurrent function starts. Fórmulas depois do simultâneas função com segurança pode assumir dependências de fórmulas dentro de: tudo será concluída antes do simultâneas função é concluído e passa para a seguinte fórmula numa cadeia (se utilizar o ; operador).Formulas after the Concurrent function can safely take dependencies on formulas within: they'll all complete before the Concurrent function finishes and moves on to the next formula in a chain (if you use the ; operator). Fique atento a dependências de ordens subtis se estiver a chamar métodos de serviço ou funções que tenham efeitos secundários.Watch out for subtle order dependencies if you're calling functions or service methods that have side effects.

Pode encadear fórmulas em conjunto com o ; operador dentro de um argumento para simultâneas.You can chain formulas together with the ; operator within an argument to Concurrent. Por exemplo, Concurrent( Set( a;; 1 );; Set( b;; a+1 );; Set( x;; 2 );; Set( y;; x+2 ) ) avalia Set( a;; 1 );; Set( b;; a+1 ) e Set( x;; 2 );; Set( y;; x+2 ) em simultâneo.For example, Concurrent( Set( a; 1 );; Set( b; a+1 ); Set( x; 2 );; Set( y; x+2 ) ) evaluates Set( a; 1 );; Set( b; a+1 ) concurrently with Set( x; 2 );; Set( y; x+2 ). Neste caso, as dependências dentro das fórmulas podem ser utilizadas: a será definida antes de b e x será definida antes de y.In this case, the dependencies within the formulas are fine: a will be set before b, and x will be set before y.

Consoante o dispositivo ou browser em que a aplicação esteja a ser executada, apenas algumas fórmulas poderão ser avaliadas em simultâneo.Depending on the device or browser in which the app is running, only a handful of formulas might actually be evaluated concurrently. A função Concurrent utiliza as funcionalidades disponíveis e não será concluída até todas as fórmulas serem avaliadas.Concurrent uses the available capabilities and won't finish until all formulas have been evaluated.

Se ativar a opção Gestão de erros ao nível da fórmula (nas definições avançadas), o primeiro erro encontrado na ordem dos argumentos será devolvido da função Concurrent. Caso contrário, será devolvida a indicação blank.If you enable Formula-level error management (in advanced settings), the first error encountered in argument order is returned from Concurrent; otherwise, blank is returned. Se todas as fórmulas forem avaliadas com êxito, será devolvida a indicação true.If all formulas are successful, true is returned. Se a avaliação de uma fórmula falhar, o resto dessa fórmula será interrompido, mas as outras fórmulas continuarão a ser avaliadas.If one formula fails, the rest of that formula stops, but other formulas continue evaluating.

Só pode utilizar a função Concurrent em fórmulas de comportamento.You can use Concurrent only in behavior formulas.

SintaxeSyntax

Concurrent( Fórmula1;; Fórmula2 [;; ...] )Concurrent( Formula1; Formula2 [; ...] )

  • Fórmula(s) – necessário.Formula(s) – Required. Fórmulas a avaliar em simultâneo.Formulas to evaluate concurrently. Tem de fornecer pelo menos duas fórmulas.You must supply at least two formulas.

ExemplosExamples

Carregar dados mais rapidamenteLoading data faster

  1. Criar uma aplicação e adicionar quatro origens de dados do Common Data Service, o SQL Server ou o SharePoint.Create an app, and add four data sources from Common Data Service, SQL Server, or SharePoint.

    Este exemplo utiliza quatro tabelas a partir da base de dados de exemplo da Adventure Works no SQL Azure.This example uses four tables from the sample Adventure Works database on SQL Azure. Depois de criar a base de dados, ligue-se à mesma a partir do PowerApps com o nome de servidor completamente qualificado (por exemplo, srvname.database.windows.net):After you create the database, connect to it from PowerApps using the fully qualified server name (for example, srvname.database.windows.net):

    Ligar à base de dados da Adventure Works no Azure

  2. Adicione um controlo Botão e defina a respetiva propriedade OnSelect para esta fórmula:Add a Button control, and set its OnSelect property to this formula:

    ClearCollect( Product; '[SalesLT].[Product]' );;
    ClearCollect( Customer; '[SalesLT].[Customer]' );;
    ClearCollect( SalesOrderDetail; '[SalesLT].[SalesOrderDetail]' );; 
    ClearCollect( SalesOrderHeader; '[SalesLT].[SalesOrderHeader]' )
    
  3. No Microsoft Edge ou Google Chrome, ative as ferramentas de programador para controlar o tráfego de rede enquanto a aplicação é executada.In Microsoft Edge or Google Chrome, turn on developer tools to monitor network traffic while your app is running.

  4. (opcional) Ative a limitação de rede para exagerar os efeitos desta comparação.(optional) Turn on network throttling to exaggerate the effects of this comparison.

  5. Selecione o botão enquanto mantém a tecla Alt premida e, em seguida, observe o tráfego de rede.While holding down the Alt key, select the button, and then watch the network traffic.

    As ferramentas mostram quatro pedidos efetuados em série, semelhante a este exemplo.The tools show four requests performed in series, similar to this example. Os tempos reais foram removidos pois irão variar muito.Actual times have been removed as they will vary wildly. O gráfico mostra que cada chamada é iniciada após a última chamada ser concluída:The graph shows that each call starts after the last has finished:

    Gráfico de tempo de quatro pedidos de rede, em que cada um deles é iniciado depois de o último ser concluído, abrangendo todo o período de tempo

  6. Guarde, feche e abra novamente a aplicação.Save, close, and reopen the app.

    Como o PowerApps coloca dados em cache, selecionar novamente o botão não causa necessariamente quatro novos pedidos.PowerApps caches data, so selecting the button again won't necessarily cause four new requests. Sempre que quiser testar o desempenho, feche e abra novamente a sua aplicação.Each time you want to test performance, close and reopen your app. Se tiver ativado a limitação de rede, recomenda-se que a desative até estar pronto para outro teste.If you turned network throttling on, you may want to turn it off until you're ready for another test.

  7. Adicione um segundo controlo Botão e defina a respetiva propriedade OnSelect a esta fórmula:Add a second Button control, and set its OnSelect property to this formula:

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

    Tenha em atenção que adicionou as mesmas chamadas ClearCollect ao primeiro botão, mas as mesmas estão agora dentro da função Concurrent e separadas por ponto e vírgulas.Note that you added the same ClearCollect calls to the first button, but they're wrapped in a Concurrent function and separated by commas this time.

  8. Limpe o monitor de rede no browser.Clear the network monitor in the browser.

  9. Se estava a utilizar a limitação de rede, ative-a novamente.If you were using network throttling before, turn it on again.

  10. Selecione o segundo botão enquanto mantém a tecla Alt premida e, em seguida, observe o tráfego de rede.While holding down the Alt key, select the second button, and then watch the network traffic.

    As ferramentas mostram quatro pedidos efetuados em simultâneo, semelhante a este exemplo.The tools show four requests performed concurrently, similar to this example. Novamente, os tempos reais foram removidos pois irão variar muito.Again, actual times have been removed as they will vary wildly. O gráfico mostra que todas as chamadas são iniciadas praticamente ao mesmo tempo e que não esperam pela conclusão da anterior:The graph shows that all the calls start at about the same time and do not wait for the previous one to finish:

    Gráfico de tempo de quatro pedidos de rede, em que os quatro são iniciados em conjunto, abrangendo cerca de metade do período de tempo

    Estes gráficos baseiam-se na mesma escala.These graphs are based on the same scale. Com a função Concurrent, conseguiu reduzir o tempo total de conclusão destas operações para metade.By using Concurrent, you halved the total amount of time these operations took to finish.

  11. Guarde, feche e abra novamente a aplicação.Save, close, and reopen the app.

Condição raceRace condition

  1. Adicione uma ligação para o serviço Microsoft Translator à sua aplicação.Add a connection to the Microsoft Translator service to your app.

  2. Adicione um controlo Entrada de texto e mude o respetivo nome para EntradaDeTexto1 se tiver um nome diferente.Add a Text input control, and rename it TextInput1 if it has a different name.

  3. Adicione um controlo Botão e defina a respetiva propriedade OnSelect para esta fórmula:Add a Button control, and set its OnSelect property to this formula:

    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. Adicione um controlo Tabela de dados e defina a respetiva propriedade Items para Resultados.Add a Data table control, and set its Items property to Results.

  5. Sobre o propriedades separador do painel direito, selecione editar campos para abrir o campos painel.On the Properties tab of the right pane, select Edit fields to open the Fields pane.

  6. Na lista de campos, selecione a caixa de verificação de cada campo para os apresentar todos na tabela de dados.In the list of fields, select the check box for each field to show them all in the data table.

  7. (opcional) Arraste o campo Entrada para a parte superior da lista e arraste o campo FrancêsMaisRápido para a parte inferior da lista.(optional) Drag the Input field to the top of the list, and drag the FrenchFaster field to the bottom of the list.

    Lista de campos na coleção de Resultados

  8. No controlo Entrada de texto, escreva ou cole uma frase para traduzir.In the Text input control, type or paste a phrase to translate.

  9. Mantenha a tecla Alt premida e selecione o botão múltiplas vezes para preencher a tabela.While holding down the Alt key, select the button multiple times to fill the table.

    Os tempos são apresentados em milissegundos.The times are shown in milliseconds.

    Apresentação da tabela de dados com os resultados da tradução da cadeia "Hello World" para francês e alemão.

    Em alguns casos, a tradução para francês é mais rápida do que a tradução para alemão e vice-versa.In some cases, the French translation is faster than the German translation, and vice versa. Ambas começam ao mesmo tempo, mas uma é concluída antes da outra por diversos motivos, incluindo a latência de rede e o processamento do lado do servidor.Both start at the same time, but one returns before the other for a variety of reasons, including network latency and server-side processing.

    Uma condição race ocorreria se a aplicação dependesse de uma tradução terminar primeiro.A race condition would occur if the app depended on one translation ending first. Felizmente, o PowerApps sinaliza a maioria das dependências de tempo que consegue detetar.Fortunately, PowerApps flags most timing dependencies that it can detect.