Partilhar via


Concurrent Função

Aplica-se a: Aplicativos de tela Aplicativos orientados por modelos

Avalia múltiplas fórmulas em simultâneo.

Descrição

A Concurrent função permite que várias fórmulas especificadas dentro da mesma propriedade sejam avaliadas ao mesmo tempo se tiverem chamadas de conector ou 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 Concurrent função, o aplicativo avaliará todas as fórmulas dentro de uma propriedade simultaneamente, mesmo depois de usar o operador ; Essa simultaneidade ajuda os usuários a esperar menos pelo mesmo resultado.

Na propriedade OnStart do seu aplicativo, use Concurrent para melhorar o desempenho quando o aplicativo 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 em que as fórmulas dentro da função começam e terminam a Concurrent avaliação. As fórmulas dentro da função não devem conter dependências de outras fórmulas dentro da mesma Concurrent função, e o Concurrent Power Apps mostra um erro se você tentar. A partir de dentro, você pode assumir com segurança dependências de fórmulas fora da Concurrent função porque elas são concluídas antes do início da Concurrent função. As fórmulas após a Concurrent função podem seguramente assumir dependências de fórmulas internas: todas serão concluídas antes que a Concurrent função termine e passam para a próxima fórmula em uma cadeia (se você usar 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.

Você pode encadear fórmulas junto com o operador ; dentro de um argumento para Concurrent. Por exemplo, Concurrent( set( a, 1 ); Conjunto( b, a+1 ), Conjunto( x, 2 ); Set( y, x+2 ) avalia set( a, 1 ); Set( b, a+1 ) simultaneamente com 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.

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. Concurrent usa os recursos disponíveis e não terminará até que todas as fórmulas tenham sido avaliadas.

Se você habilitar o gerenciamento de erros no nível da fórmula (em configurações avançadas), o primeiro erro encontrado na ordem de argumento será retornado de ; caso contrário, o espaço em branco será retornado.Concurrent 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.

Você pode usar Concurrent somente em fórmulas de comportamento.

Sintaxe

Concurrent( Fórmula 1, Fórmula 2 [, ...] )

  • Fórmulas – Obrigatório. Fórmulas a avaliar em simultâneo. Tem de fornecer pelo menos duas fórmulas.

Exemplos

Carregar dados mais rapidamente

  1. 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):

    Ligar à base de dados da Adventure Works no Azure.

  2. 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]' )
    
  3. No Microsoft Edge ou no Google Chrome, ative as ferramentas de programador para controlar o tráfego de rede enquanto a aplicação é executada.

  4. (opcional) Ative a limitação de rede para exagerar os efeitos desta comparação.

  5. 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 variam muito. O gráfico mostra que cada chamada é iniciada após a última chamada ser concluída:

    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.

    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.

  7. 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]' )
    )
    

    Observe que você adicionou as mesmas chamadas ClearCollect ao primeiro botão, mas elas estão envolvidas em uma Concurrent função e separadas por vírgulas desta vez.

  8. Limpe o monitor de rede no browser.

  9. Se estava a utilizar a limitação de rede, ative-a novamente.

  10. 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. Mais uma vez, os tempos reais foram removidos, pois variam muito. O gráfico mostra que todas as chamadas começam aproximadamente ao mesmo tempo e não espere que a anterior termine:

    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. ConcurrentUsando o , você reduz pela metade o tempo total que essas operações levavam para serem concluídas.

  11. Guarde, feche e abra novamente a aplicação.

Condição race

  1. Adicione uma ligação para o serviço Microsoft Translator à sua aplicação.

  2. Adicione um controlo Text input e mude o respetivo nome para EntradaDeTexto1 se tiver um nome diferente.

  3. 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
        }
    )
    
  4. Adicione um controlo Data table e defina a respetiva propriedade Items para Resultados.

  5. No separador Propriedades do painel direito, selecione Editar campos para abrir o painel Campos.

  6. Na lista de campos, selecione a caixa de verificação de cada campo para os apresentar todos na tabela de dados.

  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.

    Lista de campos na coleção de Resultados.

  8. No controlo Text input, escreva ou cole uma frase para traduzir.

  9. Mantenha a tecla Alt premida e selecione o botão múltiplas vezes para preencher a tabela.

    Os tempos são apresentados em milissegundos.

    Apresentação da tabela de dados que contêm resultados da tradução da cadeia

    Em alguns casos, a tradução para francês é mais rápida do que a tradução para alemão e vice-versa. Ambos começam ao mesmo tempo, mas um retorna antes do outro por vários motivos, incluindo latência de rede e 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.