Compartilhar via


Função Concurrent

Aplica-se a: Aplicativos de tela Aplicativos baseados em modelo

Avalia várias fórmulas simultaneamente.

Descrição

A função Concurrent função permite que várias fórmulas especificadas dentro da mesma propriedade sejam avaliadas ao mesmo tempo se tiverem conector ou chamadas do Dataverse. Normalmente, várias fórmulas são avaliadas pelo encadeamento delas com o operador ; (ponto-e-vírgula), que avalia cada uma sequencialmente. Com a função Concurrent, o aplicativo avaliará todas as fórmulas dentro de uma propriedade simultaneamente, mesmo depois de usar o operador ;. Essa simultaneidade ajudará os usuários a esperar menos pelo mesmo resultado.

Na propriedade OnStart do aplicativo, use Concurrent para melhorar o desempenho quando o aplicativo carrega os dados. Quando as chamadas de dados não forem iniciadas até que as chamadas anteriores sejam concluídas, o aplicativo precisará aguardar a soma de todos os tempos de solicitação. Se as chamadas de dados forem iniciadas ao mesmo tempo, o aplicativo precisará aguardar apenas pelo tempo de solicitação mais longo. Muitas vezes, os navegadores da Web melhoram o desempenho executando chamadas de rede simultaneamente.

Não é possível prever a ordem na qual as fórmulas dentro da função Concurrent iniciam e terminam a avaliação. As fórmulas dentro da função Concurrent não devem conter dependências de outras fórmulas dentro da mesma função Concurrent, e o Power Apps mostrará um erro se você tentar. Dentro dela, você pode usar as dependências com segurança em fórmulas fora da função Concurrent porque elas serão concluídas antes do início da função Concurrent. As fórmulas após a função Concurrent podem usar dependências com segurança em fórmulas dentro delas: todas elas serão concluídas antes da função Concurrent e passarão para a próxima fórmula em uma cadeia (caso você use o operador ;). Tenha cuidado com dependências de ordem sutil se estiver chamando funções ou métodos de serviço que tenham efeitos colaterais.

É possível 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 ) simultaneamente a Set( x, 2 ); Set( y, x+2 ). Neste caso, as dependências dentro das fórmulas estão corretas: a será definida antes de b e x será definida antes de y.

Dependendo do dispositivo ou do navegador no qual o aplicativo está em execução, apenas algumas fórmulas poderão realmente ser avaliadas simultaneamente. A função Concurrent usa os recursos disponíveis e não será concluída até que todas as fórmulas sejam avaliadas.

Se você habilitar o Gerenciamento de erro no nível da fórmula (em configurações avançadas), o primeiro erro encontrado na ordem de argumentos será retornado de Concurrent; caso contrário, em branco será retornado. Se todas as fórmulas forem bem-sucedidas, true será retornado. Se uma fórmula falhar, o restante da fórmula será interrompido, mas as outras fórmulas prosseguirão avaliando.

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

Sintaxe

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

  • Formula(s) - obrigatório. Fórmulas a serem avaliadas simultaneamente. É necessário fornecer pelo menos duas fórmulas.

Exemplos

Como carregar dados com mais rapidez

  1. Crie um aplicativo e adicione quatro fontes de dados do Microsoft Dataverse, SQL Server ou SharePoint.

    Este exemplo usa quatro tabelas do banco de dados de exemplo da Adventure Works no SQL Azure. Depois de criar o banco de dados, conecte-se a ele por meio do Power Apps usando o nome totalmente qualificado do servidor (por exemplo, srvname.database.windows.net):

    Conectar-se ao banco de dados da Adventure Works no Azure.

  2. Adicione um controle Button e defina sua propriedade OnSelect como 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 para desenvolvedor para monitorar o tráfego de rede durante a execução do aplicativo.

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

  5. Mantendo a tecla Alt pressionada, selecione o botão e, em seguida, observe o tráfego de rede.

    As ferramentas mostram quatro solicitações executadas em série, semelhante a este exemplo. Os tempos reais foram removidos, pois variarão muito. O grafo mostra que cada chamada é iniciada após a conclusão da última:

    Grafo de tempo de quatro solicitações de rede, cada uma sendo iniciada após a conclusão da última, abrangendo todo o intervalo de tempo.

  6. Salve, feche e reabra o aplicativo.

    O Power Apps armazena os dados em cache e, portanto, uma nova seleção do botão não necessariamente gerará quatro novas solicitações. Sempre que desejar testar o desempenho, feche e reabra o aplicativo. Se a limitação de rede estiver ativada, recomendamos desativá-la até que você esteja pronto para outro teste.

  7. Adicione um segundo controle Button e defina sua propriedade OnSelect como 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 encapsuladas em uma função Concurrent e são separadas por vírgulas desta vez.

  8. Limpe o monitor de rede no navegador.

  9. Se você estava usando a limitação de rede antes, ative-a novamente.

  10. Mantendo a tecla Alt pressionada, selecione o segundo botão e, em seguida, observe o tráfego de rede.

    As ferramentas mostram quatro solicitações executadas simultaneamente, semelhante a este exemplo. Novamente, os tempos reais foram removidos, pois variarão muito. O grafo mostra que todas as chamadas são iniciadas praticamente na mesma hora e não aguardam a conclusão da anterior:

    Grafo de tempo de quatro solicitações de rede, com todas as quatro sendo iniciadas juntas, abrangendo cerca da metade do intervalo de tempo.

    Esses grafos se baseiam na mesma escala. Usando Concurrent, você reduziu pela metade o tempo total necessário para a conclusão dessas operações.

  11. Salve, feche e reabra o aplicativo.

Condição de corrida

  1. Adicione uma conexão ao serviço Microsoft Translator ao aplicativo.

  2. Adicione um controle Text input e renomeie-o como TextInput1 caso ele tenha outro nome.

  3. Adicione um controle Button e defina sua propriedade OnSelect como 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 controle Data table e defina a propriedade Items como Results.

  5. Na guia Propriedades do painel direito, selecione Editar campos para abrir o painel Campos.

  6. Na lista de campos, marque a caixa de seleção de cada campo para mostrar todos eles na tabela de dados.

  7. (opcional) Arraste o campo Input para a parte superior da lista e, em seguida, arraste o campo FrenchFaster para a parte inferior da lista.

    Lista de campos na coleção Result.

  8. No controle Text input, digite ou cole uma frase para traduzi-la.

  9. Mantendo a tecla Alt pressionada, selecione o botão várias vezes para preencher a tabela.

    Os tempos são mostrados em milissegundos.

    Exibição da tabela de dados contendo resultados da tradução da cadeia de caracteres

    Em alguns casos, a tradução em francês é mais rápida do que a tradução em alemão e vice-versa. Ambas são iniciadas ao mesmo tempo, mas uma é retornada antes da outra por uma variedade de motivos, incluindo latência de rede e processamento do servidor.

    Uma condição de corrida ocorre se o aplicativo depende da conclusão de uma tradução primeiro. Felizmente, o Power Apps sinaliza a maioria das dependências de tempo que ele pode detectar.