Функция Concurrent
Применимо к: Приложениям Canvas Приложениям, управляемым моделями
Оценивает несколько формул одновременно.
Описание
Функция 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 можно использовать только в формулах поведения.
Синтаксис
Параллельно( Формула1, Формула2 [, ...] )
- Формулы – Обязательно. Формулы для одновременного вычисления. Необходимо указать по крайней мере две формулы.
Примеры
Ускоренная загрузка данных
Создайте приложение и добавьте четыре источника данных из Microsoft Dataverse, SQL Server или SharePoint.
В этом примере используется четыре таблицы из образца базы данных Adventure Works для SQL Azure. После создания базы данных подключитесь к ней из Power Apps, используя полное имя сервера (например, srvname.database.windows.net):
Добавьте элемент управления Button и задайте следующую формулу в качестве значения свойства OnSelect:
ClearCollect( Product, '[SalesLT].[Product]' ); ClearCollect( Customer, '[SalesLT].[Customer]' ); ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ); ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )
В Microsoft Edge или Google Chrome включите средства разработчика для отслеживания сетевого трафика во время работы приложения.
(необязательно) Включите регулирование сети, чтобы подчеркнуть результат этого сравнения.
Удерживая нажатой клавишу ALT, нажмите кнопку и следите за сетевым трафиком.
Средства показывают четыре запроса, которые выполняются последовательно, как в этом примере. Фактическое время не показано, так как оно зависит от многих факторов. На диаграмме видно, что каждый вызов начинается после завершения предыдущего:
Сохраните, закройте и повторно откройте приложение.
Power Apps кэширует данные, поэтому, если вы снова нажмете на кнопку, это не обязательно приведет к четырем новым запросам. Каждый раз, когда вы собираетесь протестировать производительность, закройте и снова откройте приложение. Если вы включили функцию регулирования в сети, стоит отключить ее до выполнения следующего теста.
Добавьте второй элемент управления Button и задайте следующую формулу в качестве значения свойства OnSelect:
Concurrent( ClearCollect( Product, '[SalesLT].[Product]' ), ClearCollect( Customer, '[SalesLT].[Customer]' ), ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ), ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' ) )
Обратите внимание, что вы добавили те же вызовы ClearCollect к первой кнопке, но на этот раз с функцией Concurrent и разделением запятыми.
Очистите сетевой монитор в браузере.
Если вы использовали регулирования сети, включите его снова.
Удерживая нажатой клавишу ALT, нажмите вторую кнопку и следите за сетевым трафиком.
Средства показывают четыре запроса, которые выполняются одновременно, как в этом примере. Фактическое время снова не показано, так как оно зависит от многих факторов. На диаграмме видно, что все вызовы начинаются одновременно и не ожидают завершения предыдущего:
В диаграммах используется одна и та же шкала. С помощью функции Concurrent вам удалось в два раза сократить время выполнения этих операций.
Сохраните, закройте и повторно откройте приложение.
Состояние гонки
Добавьте в свое приложение подключение к службе Microsoft Переводчик .
Добавьте элемент управления Text input и переименуйте его в TextInput1, если у него другое имя.
Добавьте элемент управления 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 } )
Добавьте элемент управления Data table и укажите для свойства Items значение Результаты.
На вкладке Свойства на панели справа выберите Изменить поля, чтобы открыть панель Поля.
В списке полей установите флажок для каждого поля, которое должно отображаться в таблице данных.
(необязательно) Перетащите поле Input в верхнюю часть списка, а поле FrenchFaster — в нижнюю.
В элементе управления Text input введите или вставьте фразу для перевода.
Удерживая нажатой клавишу ALT, несколько раз нажмите на кнопку, чтобы заполнить таблицу.
Время указывается в миллисекундах.
В некоторых случаях перевод на французский выполняется быстрее, чем на немецкий, и наоборот. Обе операции перевода начинаются одновременно, но одна возвращается раньше другой по нескольким причинам, включая задержки сети и обработку на сервере.
Состояние гонки возникает в случае, если приложение зависит от того, что один перевод завершится быстрее. К счастью, Power Apps отмечает большинство зависимостей от времени, которые может обнаружить.