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 )。 在此情況下,公式內的相依性良好:將在 b 前面設定 a,並在 y 前面設定 x。
根據應用程式執行所在的裝置或瀏覽器,實際上可能只會同時評估少數幾個公式。 Concurrent 使用可用的功能,而且在評估所有公式之前不會完成。
如果您啟用 公式層級的錯誤管理 (在進階設定中),則會從 Concurrent 傳回引數順序中遇到的第一個錯誤;否則會傳回 空白。 如果所有公式成功執行,會傳回 true。 如果一則公式失敗,則該公式其餘部分會停止,但其他公式會繼續評估。
您只能在 行為公式 中使用 Concurrent。
語法
Concurrent( Formula1, Formula2 [, ...] )
- Formula(s) - 必要項目。 預計同時評估的公式。 您必須至少提供兩則公式。
範例
更快載入資料
建立應用程式,並從 Microsoft Dataverse、SQL Server 或 SharePoint 中新增四個資料來源。
此範例使用 SQL Azure 上的範例 Adventure Works 資料庫 四個資料表。 在您建立資料庫之後,請使用完整合格的伺服器名稱 (例如,srvname.database.windows.net) 從 Power Apps 連線:
新增 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 Translator 服務的連線新增至應用程式。
新增 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 屬性設定為 Results。
在右側窗格的 Properties 索引標籤上,選取 Edit fields 開啟 Fields 窗格。
在欄位清單中,選取每個欄位的勾選方塊,使其在資料表中全部顯示。
(非必要) 將 Input 欄位拖曳至清單頂端,並將 FrenchFaster 欄位拖曳至清單底端。
在 Text input 控制項中,輸入或貼上要翻譯的短語。
按住 Alt 鍵時,選取按鈕多次以填滿資料表。
時間會以毫秒顯示。
在某些情況下,法文翻譯的速度會比德文翻譯還要快,反之亦然。 這兩個會同時開始,但基於各種原因 (包括網路延遲和伺服器端處理),其中一個會在另一個之前傳回。
如果應用程式依賴先結束的一個翻譯,會發生 競爭情況。 幸運的是,Power Apps 會標識可偵測到大部分時間的相依性。