Паралельна функція
Застосовується до: програм 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 кешує дані, тому повторне натискання кнопки не обов’язково спричинить чотири нові запити. Для кожної перевірки продуктивності необхідно закривати і знову відкривати програму. Якщо ввімкнено дроселювання мережі його, можливо, знадобиться вимкнути, доки не буде виконана підготовка до наступної перевірки.
Додайте другий елемент керування Кнопка та настройте його властивість OnSelect відповідно до вказаної нижче формули.
Concurrent( ClearCollect( Product, '[SalesLT].[Product]' ), ClearCollect( Customer, '[SalesLT].[Customer]' ), ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ), ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' ) )
Зверніть увагу, що до першої кнопки додані такі самі виклики ClearCollect, однак цього разу вони включені у функцію Concurrent і розділені комами.
Очистіть мережевий монітор у браузері.
Якщо дроселювання мережі вже використовувалося, знову ввімкніть його.
Утримуючи клавішу Alt, натисніть другу кнопку, а потім перегляньте мережевий трафік.
Інструменти відобразять чотири запити, виконані одночасно, подібно до цього прикладу. Як уже зазначалося, фактичний час було стерто, оскільки він дуже відрізнятиметься. На діаграмі видно, що всі виклики починаються приблизно в той самий час без очікування завершення попереднього виклику.
Ці діаграми мають однаковий масштаб. За допомогою функції Concurrent вдвічі скоротився загальний час виконання вищезазначених операцій.
Збережіть, закрийте і знову відкрийте програму.
Умова змагання
Додайте підключення до Microsoft служби Перекладач у свій додаток.
Додайте елемент керування Ввід тексту та перейменуйте його на TextInput1, якщо його ім’я відрізняється.
Додайте елемент керування Кнопка та настройте його властивість 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 } )
Додайте елемент керування Таблиця даних і встановіть для його властивості Items значення Results (Результати).
На вкладці Властивості в області праворуч виберіть елемент Редагувати поля, щоб відкрити область Поля.
У списку полів установіть прапорець для кожного поля, щоб вони відображалися в таблиці даних.
(Необов’язково) Перетягніть поле Input до верхньої частини списку, а поле FrenchFaster – до нижньої його частини.
В елементі керування Ввід тексту введіть або вставте фразу для перекладу.
Утримуючи клавішу Alt, натисніть кнопку кілька разів, щоб заповнити таблицю.
Час відображається в мілісекундах.
У деяких випадках переклад французькою мовою відбувається швидше, ніж німецькою, і навпаки. Переклад обома мовами розпочинається одночасно, однак один із результатів повертається раніше, що залежить від низки причин, як-от затримка мережі й обробка на сервері.
Якби програма залежала від одного перекладу, що завершується першим, виникла б умова змагання. На щастя, Power Apps позначає більшість часових залежностей, які може виявити.