PowerApps の Concurrent 関数Concurrent function in PowerApps

複数の数式をそれぞれ同時に評価します。Evaluates multiple formulas concurrently with one another.

説明Description

Concurrent 関数では、同時に複数の数式を評価します。The Concurrent function evaluates multiple formulas at the same time. 通常、複数の数式は、 ; (または ; ) 演算子を使用して連結することにより評価します。これによって、各数式は順番に評価されます。Normally, multiple formulas are evaluated by chaining them together with the ; (or ;;) operator, which evaluates each sequentially in order. アプリによって操作を同時に実行すると、同じ結果がユーザーに返されるまでの時間は短くなります。When the app performs operations concurrently, users wait less for the same result.

アプリの OnStart プロパティで、Concurrent を使用すると、アプリがデータを読み込む際のパフォーマンスが向上します。In the OnStart property of your app, use Concurrent to improve performance when the app loads data. 前の呼び出しが完了するまで、データ呼び出しが開始されない場合、アプリはすべての要求時間を合計した期間、待機する必要があります。When data calls don't start until the previous calls finish, the app must wait for the sum of all request times. データ呼び出しが同時に開始される場合、アプリは最長の要求時間を待機するだけで済みます。If data calls start at the same time, the app needs to wait only for the longest request time. Web ブラウザーは、多くの場合、データ操作を同時に実行することによってパフォーマンスを向上させます。Web browsers often improve performance by performing data operations concurrently.

Concurrent 関数内の数式が評価を開始および終了する順番は予測できません。You can't predict the order in which formulas within the Concurrent function start and end evaluation. Concurrent 関数内の数式には、同じ Concurrent 関数内の他の数式との依存関係を含めないでください。それを行うと、PowerApps によってエラーが表示されます。Formulas within the Concurrent function shouldn't contain dependencies on other formulas within the same Concurrent function, and PowerApps shows an error if you try. Concurrent 関数内にある数式は、この関数の外側にある数式に安全に依存することができます。外側にある数式は Concurrent 関数が開始する前に完了するからです。From within, you can safely take dependencies on formulas outside the Concurrent function because they will complete before the Concurrent function starts. Concurrent 関数の後に置かれた数式は、この関数内の数式に安全に依存することができます。そのような後に置かれた数式がすべて完了してから、Concurrent 関数は終了しチェーン内の次の数式に移動するからです (; または ;; 演算子を使用した場合)。Formulas after the Concurrent function can safely take dependencies on formulas within: they'll all complete before the Concurrent function finishes and moves on to the next formula in a chain (if you use the ; or ;; operator). 副作用がある関数またはサービス メソッドを呼び出す場合は、微妙な順序の依存関係に注意してください。Watch out for subtle order dependencies if you're calling functions or service methods that have side effects.

Concurrent に対する引数内で ; (;;) 演算子を使用して数式を連結することができます。You can chain formulas together with the ; (or ;;) operator within an argument to 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 ) と同時に評価します。For example, Concurrent( Set( a, 1 ); Set( b, a+1 ), Set( x, 2 ); Set( y, x+2 ) ) evaluates Set( a, 1 ); Set( b, a+1 ) concurrently with Set( x, 2 ); Set( y, x+2 ). この場合、数式内の依存関係は問題ありません: ab の前に設定されます。xy の前に設定されます。In this case, the dependencies within the formulas are fine: a will be set before b, and x will be set before y.

アプリが実行されているデバイスまたはブラウザーによっては、実際には少数の数式しか同時に評価されない可能性があります。Depending on the device or browser in which the app is running, only a handful of formulas might actually be evaluated concurrently. Concurrent は使用可能な機能を使用し、すべての数式が評価されるまで完了しません。Concurrent uses the available capabilities and won't finish until all formulas have been evaluated.

[数式レベルのエラー管理] (詳細設定) を有効にした場合、引数の順序で最初に発生したエラーが Concurrent から返されます。それ以外の場合は、”空白” が返されます。If you enable Formula-level error management (in advanced settings), the first error encountered in argument order is returned from Concurrent; otherwise, blank is returned. すべての数式が成功すると、true が返されます。If all formulas are successful, true is returned. 1 つの数式が失敗した場合、その数式の残りの部分は停止しますが、他の数式は引き続き評価されます。If one formula fails, the rest of that formula stops, but other formulas continue evaluating.

Concurrent は、動作の数式内でのみ使用できます。You can use Concurrent only in behavior formulas.

構文Syntax

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

  • Formula(s) - 必須。Formula(s) – Required. 同時に評価する数式の数。Formulas to evaluate concurrently. 2 つ以上の数式を指定する必要があります。You must supply at least two formulas.

Examples

データの読み込みが速くなるLoading data faster

  1. アプリを作成し、Common Data Service for Apps、SQL Server、または SharePoint からの 4 つのデータ ソースを追加します。Create an app, and add four data sources from Common Data Service for Apps, SQL Server, or SharePoint.

    この例では、SQL Azure 上のサンプル Adventure Works データベースからの 4 つの表を使用します。This example uses four tables from the sample Adventure Works database on SQL Azure. データベースを作成したら、完全修飾サーバー名 (たとえば、srvname.database.windows.net) を使用して PowerApps からデータベースに接続します。After you create the database, connect to it from PowerApps using the fully qualified server name (for example, srvname.database.windows.net):

    Azure 内の Adventure Works データベースに接続する

  2. [ボタン] コントロールを追加し、その OnSelect プロパティに次の式を設定します。Add a Button control, and set its OnSelect property to this formula:

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

  3. Microsoft Edge または Google Chrome で、アプリが実行されている間にネットワーク トラフィックを監視する開発者ツールを有効にします。In Microsoft Edge or Google Chrome, turn on developer tools to monitor network traffic while your app is running.

  4. (省略可能) 帯域幅調整をオンにして、この比較の結果を強調します。(optional) Turn on network throttling to exaggerate the effects of this comparison.

  5. Alt キーを押しながら、ボタンを選択し、ネットワーク トラフィックを監視します。While holding down the Alt key, select the button, and then watch the network traffic.

    ツールには、次の例のように、順に実行された 4 つの要求が表示されます。The tools show four requests performed in series, similar to this example. 実際の時間は大幅に変動するため、削除されています。Actual times have been removed as they will vary wildly. グラフでは、各呼び出しは 1 つ前の呼び出しが完了してから開始されているのがわかります。The graph shows that each call starts after the last has finished:

    4 つのネットワーク要求の時間グラフであり (各要求は 1 つ前の要求が終了してから開始されている)、期間全体をカバーしている

  6. アプリを保存し、閉じてから、もう一度開きます。Save, close, and reopen the app.

    PowerApps ではデータがキャッシュされるので、ボタンをもう一度選択しても 4 つの新しい要求が発生するとは限りません。PowerApps caches data, so selecting the button again won't necessarily cause four new requests. パフォーマンスをテストするたびに、アプリを閉じて再度開きます。Each time you want to test performance, close and reopen your app. 帯域幅調整がオンになっている場合、別のテストの準備が整うまで帯域幅調整をオフにしておきたい場合があります。If you turned network throttling on, you may want to turn it off until you're ready for another test.

  7. 2 つ目の [ボタン] コントロールを追加し、その OnSelect プロパティに次の式を設定します。Add a second Button control, and set its OnSelect property to this formula:

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

    最初のボタンに対するものと同じ ClearCollect 呼び出しを追加しましたが、今回は Concurrent 関数内にラップされ、コンマで区切られていることに注目してください。Note that you added the same ClearCollect calls to the first button, but they're wrapped in a Concurrent function and separated by commas this time.

  8. ブラウザーでネットワーク モニターをオフにします。Clear the network monitor in the browser.

  9. 帯域幅調整を以前に使用していた場合は、再度オンにします。If you were using network throttling before, turn it on again.

  10. Alt キーを押しながら、2 番目のボタンを選択し、ネットワーク トラフィックを監視します。While holding down the Alt key, select the second button, and then watch the network traffic.

    ツールには、次の例のように、同時に実行された 4 つの要求が表示されます。The tools show four requests performed concurrently, similar to this example. 繰り返しますが、実際の時間は大幅に変動するため、削除されています。Again, actual times have been removed as they will vary wildly. グラフでは、すべての呼び出しがほぼ同時に開始され、前の呼び出しが終了するまで待機していないことがわかります。The graph shows that all the calls start at about the same time and do not wait for the previous one to finish:

    4 つのネットワーク要求の時間グラフであり (4 つの要求は一緒に開始されている)、期間全体をカバーしている

    これらのグラフは、同じスケールに基づいています。These graphs are based on the same scale. Concurrent を使用することにより、これらの操作が完了するまでに要した合計時間を半減させることができます。By using Concurrent, you halved the total amount of time these operations took to finish.

  11. アプリを保存し、閉じてから、もう一度開きます。Save, close, and reopen the app.

競合状態Race condition

  1. Microsoft Translator サービスへの接続をアプリに追加します。Add a connection to the Microsoft Translator service to your app.

  2. [テキスト入力] コントロールを追加し、別の名前になっている場合は TextInput1 に名前を変更します。Add a Text input control, and rename it TextInput1 if it has a different name.

  3. [ボタン] コントロールを追加し、その OnSelect プロパティに次の式を設定します。Add a Button control, and set its OnSelect property to this formula:

    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
        }
    )
    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. [データ テーブル] コントロールを追加し、その Items プロパティを Results に設定します。Add a Data table control, and set its Items property to Results.

  5. 右側のウィンドウの [プロパティ] タブで、[結果] を選択して [データ] ウィンドウを開きます。On the Properties tab of the right pane, select Results to open the Data pane.

  6. フィールドのリストで、データ テーブル内にすべてのフィールドが表示されるように各フィールドのチェック ボックスをオンにします。In the list of fields, select the check box for each field to show them all in the data table.

  7. (省略可能) [入力] フィールドをリストの先頭にドラッグし、FrenchFaster フィールドをリストの一番下にドラッグします。(optional) Drag the Input field to the top of the list, and drag the FrenchFaster field to the bottom of the list.

    結果コレクション内のフィールドのリスト

  8. [テキスト入力] コントロールで、翻訳する語句を入力するか貼り付けます。In the Text input control, type or paste a phrase to translate.

  9. Alt キーを押しながら、ボタンを複数回選択してテーブルに入力します。While holding down the Alt key, select the button multiple times to fill the table.

    時間はミリ秒単位で表示されます。The times are shown in milliseconds.

    文字列 "Hello World" をフランス語とドイツ語に翻訳した結果が含まれるデータ テーブルの表示。

    場合によっては、フランス語への翻訳はドイツ語への翻訳よりも速く行われます。その逆もあります。In some cases, the French translation is faster than the German translation, and vice versa. 両方が同時に開始されても、ネットワーク待機時間やサーバー側の処理など、さまざまな理由により、一方の翻訳が他方の翻訳よりも前に返されます。Both start at the same time, but one returns before the other for a variety of reasons, including network latency and server-side processing.

    アプリが最初に終了した 1 つの翻訳に依存している場合は、競合状態が発生します。A race condition would occur if the app depended on one translation ending first. さいわいにも、PowerApps では、検出できるほとんどのタイミングの依存関係にフラグを付けています。Fortunately, PowerApps flags most timing dependencies that it can detect.