共用方式為


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

語法

併發公式 1公式 2 [,...])

  • Formulas(公式) –必需。 預計同時評估的公式。 您必須至少提供兩則公式。

範例

更快載入資料

  1. 建立應用程式,並從 Microsoft Dataverse、SQL Server 或 SharePoint 中新增四個資料來源。

    此範例使用 SQL Azure 上的範例 Adventure Works 資料庫 四個資料表。 在您建立資料庫之後,請使用完整合格的伺服器名稱 (例如,srvname.database.windows.net) 從 Power Apps 連線:

    在 Azure 中連線至 Adventure Works 資料庫。

  2. 新增 Button 控制項,並將其 OnSelect 屬性設定為以下公式:

    ClearCollect( Product, '[SalesLT].[Product]' );
    ClearCollect( Customer, '[SalesLT].[Customer]' );
    ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' );
    ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )
    
  3. Microsoft EdgeGoogle 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 屬性設定為 Results

  5. 在右側窗格的 Properties 索引標籤上,選取 Edit fields 開啟 Fields 窗格。

  6. 在欄位清單中,選取每個欄位的勾選方塊,使其在資料表中全部顯示。

  7. (非必要) 將 Input 欄位拖曳至清單頂端,並將 FrenchFaster 欄位拖曳至清單底端。

    結果集合物件中的欄位清單。

  8. Text input 控制項中,輸入或貼上要翻譯的短語。

  9. 按住 Alt 鍵時,選取按鈕多次以填滿資料表。

    時間會以毫秒顯示。

    顯示包含將字串

    在某些情況下,法文翻譯的速度會比德文翻譯還要快,反之亦然。 這兩個會同時開始,但基於各種原因 (包括網路延遲和伺服器端處理),其中一個會在另一個之前傳回。

    如果應用程式依賴先結束的一個翻譯,會發生 競爭情況。 幸運的是,Power Apps 會標識可偵測到大部分時間的相依性。