Поделиться через


Concurrent функция

Применимо к: Приложения на основе модели на основе холста

Оценивает несколько формул одновременно.

Описание

Функция Concurrent позволяет оценивать несколько формул, указанных в одном свойстве, одновременно, если они имеют соединитель или вызовы Dataverse. Обычно несколько формул вычисляются последовательно путем их объединения в цепочку с помощью оператора ; (точка с запятой), который вычисляет каждую формулу последовательно. Concurrent С помощью функции приложение будет оценивать все формулы в свойстве одновременно даже после использования оператора ; . Это параллелизм помогает пользователям ждать меньше того же результата.

В свойстве OnStart приложения используйте Concurrent для повышения производительности при загрузке данных. Если вызов данных не начинается до завершения предыдущего вызова, время ожидания в приложении будет суммой времени выполнения всех запросов по очереди. Если вызовы данных запускаются одновременно, временем ожидания будет время выполнения самого долгого запроса. Веб-браузеры часто повышают производительность, одновременно выполняя сетевые вызовы.

Вы не можете предсказать порядок, в котором формулы в начальной и конечной оценке Concurrent функции. Формулы в функции не должны содержать зависимости от других формул в Concurrent той же Concurrent функции, и Power Apps отображает ошибку при попытке. Изнутри можно безопасно принимать зависимости от формул вне Concurrent функции, так как они завершаются до Concurrent запуска функции. Формулы после того, как Concurrent функция может безопасно принимать зависимости от формул в пределах: все они завершаются до Concurrent завершения функции и переходят к следующей формуле в цепочке (если используется оператор ; ). Остерегайтесь незаметных зависимостей от порядка, если вызываете функции или методы службы с побочными эффектами.

Формулы можно цепочки вместе с оператором ; в аргументе Concurrent. Например, Concurrent( Set( a, 1 ); Set( b, a+1), Set( x, 2 ); Set( y, x+2 ) ) вычисляет Set( a, 1 ); Set( b, a+1 ) параллельно с Set( x, 2 ); Set( y, x+2 ). В этом случае зависимости в формулах допускаются: a устанавливается до b, а x устанавливается до y.

В зависимости от устройства или браузера, в котором выполняется приложение, только некоторые формулы могут вычисляться одновременно. Concurrent использует доступные возможности и не завершит работу до тех пор, пока не будут оценены все формулы.

Если включить управление ошибками на уровне формул (в расширенных параметрах), первая ошибка, обнаруженная в порядке аргументов, возвращается из Concurrent; в противном случае возвращается пустое значение. Если все формулы выполняются успешно, возвращается true. В случае сбоя одной формулы она останавливается, а остальные вычисляются дальше.

Можно использовать Concurrent только в формулах поведения.

Синтаксис

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

  • Формулы – Обязательно. Формулы для одновременного вычисления. Необходимо указать по крайней мере две формулы.

Примеры

Ускоренная загрузка данных

  1. Создайте приложение и добавьте четыре источника данных из Microsoft Dataverse, SQL Server или SharePoint.

    В этом примере используется четыре таблицы из образца базы данных Adventure Works для SQL Azure. После создания базы данных подключитесь к ней из Power Apps, используя полное имя сервера (например, srvname.database.windows.net):

    Подключение к базе данных Adventure Works в Azure.

  2. Добавьте элемент управления Button и задайте следующую формулу в качестве значения свойства OnSelect:

    ClearCollect( Product, '[SalesLT].[Product]' );
    ClearCollect( Customer, '[SalesLT].[Customer]' );
    ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' );
    ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )
    
  3. В Microsoft Edge или Google Chrome включите средства разработчика для отслеживания сетевого трафика во время работы приложения.

  4. (необязательно) Включите регулирование сети, чтобы подчеркнуть результат этого сравнения.

  5. Удерживая нажатой клавишу ALT, нажмите кнопку и следите за сетевым трафиком.

    Средства показывают четыре запроса, которые выполняются последовательно, как в этом примере. Фактическое время было удалено, так как они изменяются дико. На диаграмме видно, что каждый вызов начинается после завершения предыдущего:

    Временная диаграмма четырех сетевых запросов, каждый из которых начинается после завершения предыдущего, увеличивая общий промежуток времени.

  6. Сохраните, закройте и повторно откройте приложение.

    Power Apps кэширует данные, поэтому, если вы снова нажмете на кнопку, это не обязательно приведет к четырем новым запросам. Каждый раз, когда вы собираетесь протестировать производительность, закройте и снова откройте приложение. Если вы включили функцию регулирования в сети, стоит отключить ее до выполнения следующего теста.

  7. Добавьте второй элемент управления Button и задайте следующую формулу в качестве значения свойства OnSelect:

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

    Обратите внимание, что вы добавили те же вызовы ClearCollect к первой кнопке, но они упакованы в Concurrent функцию и разделены запятыми на этот раз.

  8. Очистите сетевой монитор в браузере.

  9. Если вы использовали регулирования сети, включите его снова.

  10. Удерживая нажатой клавишу ALT, нажмите вторую кнопку и следите за сетевым трафиком.

    Средства показывают четыре запроса, которые выполняются одновременно, как в этом примере. Опять же, фактические времена были удалены, так как они изменяются дико. На графике показано, что все вызовы начинаются примерно в одно и то же время и не ждут завершения предыдущего:

    Временной график четырех сетевых запросов, выполняющихся одновременно, приблизительно в два раза быстрее.

    В диаграммах используется одна и та же шкала. При использовании Concurrentвы сократили общее время, затраченное на завершение этих операций.

  11. Сохраните, закройте и повторно откройте приложение.

Состояние гонки

  1. Добавьте подключение к службе Microsoft Translator в приложение.

  2. Добавьте элемент управления Text input и переименуйте его в TextInput1, если у него другое имя.

  3. Добавьте элемент управления Button и задайте следующую формулу в качестве значения свойства OnSelect:

    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. Добавьте элемент управления Data table и укажите для свойства Items значение Результаты.

  5. На вкладке Свойства на панели справа выберите Изменить поля, чтобы открыть панель Поля.

  6. В списке полей установите флажок для каждого поля, которое должно отображаться в таблице данных.

  7. (необязательно) Перетащите поле Input в верхнюю часть списка, а поле FrenchFaster — в нижнюю.

    Список полей в коллекции результатов.

  8. В элементе управления Text input введите или вставьте фразу для перевода.

  9. Удерживая нажатой клавишу ALT, несколько раз нажмите на кнопку, чтобы заполнить таблицу.

    Время указывается в миллисекундах.

    Отображение таблицы данных, содержащей результаты перевода строки «Hello World» на французский и немецкий языки. Иногда перевод на французский выполняется быстрее, чем на немецкий, а иногда наоборот.

    В некоторых случаях перевод на французский выполняется быстрее, чем на немецкий, и наоборот. Оба запускают одновременно, но они возвращаются перед другими по различным причинам, включая задержку сети и обработку на стороне сервера.

    Состояние гонки возникает в случае, если приложение зависит от того, что один перевод завершится быстрее. К счастью, Power Apps отмечает большинство зависимостей от времени, которые может обнаружить.