Função Concurrent
Aplica-se a: Aplicativos de tela Aplicativos controlados por modelo
Avalia múltiplas fórmulas em simultâneo.
Descrição
A função Simultâneo permite que várias fórmulas especificadas na mesma propriedade sejam avaliadas ao mesmo tempo se tiverem conectores ou chamadas ao Dataverse. Normalmente, múltiplas fórmulas são avaliadas ao serem encadeadas com o operador ; (ponto e vírgula), o qual avalia cada fórmula sequencialmente. Com a função Simultâneo, a aplicação irá avaliar todas as fórmulas numa propriedade em simultâneo, mesmo depois de utilizar o operador ";". Esta simultaneidade irá ajudar os utilizadores a aguardar menos pelo mesmo resultado.
Na propriedade OnStart da sua aplicação, utilize Concurrent para melhorar o desempenho quando a aplicação carrega dados. 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. Se as chamadas de dados forem iniciadas ao mesmo tempo, a aplicação só precisa de esperar pelo tempo do pedido mais longo. O desempenho dos browsers é muitas vezes melhorado ao efetuar chamadas à rede em simultâneo.
Não é possível prever a ordem pela qual as fórmulas dentro da função Concurrent são avaliadas. 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 Power Apps apresentará um erro. 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. As fórmulas depois da função Concurrent podem utilizar dependências de fórmulas dentro da função: todas serão concluídas antes de a função Concurrent terminar e passar para a próxima fórmula na cadeia (se utilizar o operador ;). 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.
Pode encadear fórmulas com o operador ; dentro de um argumento para 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. 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.
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. O Concurrent usa os recursos disponíveis e não será concluído até que todas as fórmulas tenham sido avaliadas.
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. Se todas as fórmulas forem avaliadas com êxito, será devolvida a indicação true. 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.
Só pode utilizar a função Concurrent em fórmulas de comportamento.
Sintaxe
Concomitante( Formula1,Formula2 [, ...] )
- Fórmulas – Obrigatório. Fórmulas a avaliar em simultâneo. Tem de fornecer pelo menos duas fórmulas.
Exemplos
Carregar dados mais rapidamente
Crie uma aplicação e adicione quatro origens de dados do Microsoft Dataverse, SQL Server ou SharePoint.
Este exemplo utiliza quatro tabelas a partir da base de dados de exemplo da Adventure Works no SQL Azure. Depois de criar a base de dados, ligue-se à mesma a partir do Power Apps com o nome de servidor completamente qualificado (por exemplo, srvname.database.windows.net):
Adicione um controlo Button e defina a respetiva propriedade OnSelect para esta fórmula:
ClearCollect( Product, '[SalesLT].[Product]' ); ClearCollect( Customer, '[SalesLT].[Customer]' ); ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ); ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )
No Microsoft Edge ou no Google Chrome, ative as ferramentas de programador para controlar o tráfego de rede enquanto a aplicação é executada.
(opcional) Ative a limitação de rede para exagerar os efeitos desta comparação.
Selecione o botão enquanto mantém a tecla Alt premida e, em seguida, observe o tráfego de rede.
As ferramentas mostram quatro pedidos efetuados em série, semelhante a este exemplo. Os tempos reais foram removidos pois irão variar muito. O gráfico mostra que cada chamada é iniciada após a última chamada ser concluída:
Guarde, feche e abra novamente a aplicação.
Como o Power Apps coloca dados em cache, selecionar novamente o botão não causa necessariamente quatro novos pedidos. Sempre que quiser testar o desempenho, feche e abra novamente a sua aplicação. Se tiver ativado a limitação de rede, recomenda-se que a desative até estar pronto para outro teste.
Adicione um segundo controlo Button e defina a respetiva propriedade OnSelect a esta fórmula:
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.
Limpe o monitor de rede no browser.
Se estava a utilizar a limitação de rede, ative-a novamente.
Selecione o segundo botão enquanto mantém a tecla Alt premida e, em seguida, observe o tráfego de rede.
As ferramentas mostram quatro pedidos efetuados em simultâneo, semelhante a este exemplo. Novamente, os tempos reais foram removidos pois irão variar muito. 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:
Estes gráficos baseiam-se na mesma escala. Com a função Concurrent, conseguiu reduzir o tempo total de conclusão destas operações para metade.
Guarde, feche e abra novamente a aplicação.
Condição race
Adicione uma conexão ao Microsoft serviço Tradutor ao seu aplicativo.
Adicione um controlo Text input e mude o respetivo nome para EntradaDeTexto1 se tiver um nome diferente.
Adicione um controlo Button e defina a respetiva propriedade OnSelect para esta fórmula:
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 } )
Adicione um controlo Data table e defina a respetiva propriedade Items para Resultados.
No separador Propriedades do painel direito, selecione Editar campos para abrir o painel Campos.
Na lista de campos, selecione a caixa de verificação de cada campo para os apresentar todos na tabela de dados.
(opcional) Arraste o campo Entrada para a parte superior da lista e arraste o campo FrancêsMaisRápido para a parte inferior da lista.
No controlo Text input, escreva ou cole uma frase para traduzir.
Mantenha a tecla Alt premida e selecione o botão múltiplas vezes para preencher a tabela.
Os tempos são apresentados em milissegundos.
Em alguns casos, a tradução para francês é mais rápida do que a tradução para alemão e 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.
Uma condição race ocorreria se a aplicação dependesse de uma tradução terminar primeiro. Felizmente, o Power Apps sinaliza a maioria das dependências de tempo que consegue detetar.