Compartilhar via


Concurrent Função

Aplica-se a: Aplicativos de tela controlados por modelos

Avalia várias fórmulas simultaneamente.

Descrição

A Concurrent função permite que várias fórmulas especificadas na mesma propriedade sejam avaliadas ao mesmo tempo se tiverem chamadas do conector ou 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 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 carregar 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.

Você não pode prever a ordem na qual as fórmulas dentro da avaliação de início e de término da Concurrent função. As fórmulas dentro da Concurrent função não devem conter dependências em outras fórmulas dentro da mesma Concurrent função, e o Power Apps mostrará um erro se você tentar. De dentro, você pode assumir com segurança as 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 assumir com segurança as dependências das fórmulas dentro: todas elas serão concluídas antes que a Concurrent função seja concluída e passarão para a próxima fórmula em uma cadeia (se você usar 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.

Você pode encadear fórmulas junto 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 com 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. Concurrent usa os recursos disponíveis e não será concluído 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 do Concurrentargumento será retornado; caso contrário, será retornado em branco . 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 Concurrentfórmulas de comportamento.

Sintaxe

Concurrent( Fórmula1, Fórmula2 [, ...] )

  • Fórmulas – 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 à medida que variam descontroladamente. 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 são encapsuladas em uma Concurrent função e 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 à medida que variam descontroladamente. O grafo mostra que todas as chamadas começam ao mesmo tempo e não esperam que a anterior seja concluída:

    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. Ao usar Concurrent, você reduziu pela metade o tempo total que essas operações levaram para serem concluídas.

  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. 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 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.