次の方法で共有


Concurrent 関数

適用対象: キャンバス アプリ モデル駆動型アプリ

複数の数式を相互に同時に評価します。

説明

Concurrent関数を使用すると、コネクタまたは Dataverse 呼び出しがある場合に、同じプロパティ内で指定された複数の数式を同時に評価できます。 通常、複数の数式は ; (セミコロン) 演算子と一緒にチェーンすることで評価され、それぞれの式が順番に評価されます。 Concurrent関数を使用すると、アプリは;演算子を使用した後でも、プロパティ内のすべての数式を同時に評価します。 このコンカレンシーは、ユーザーが同じ結果を待つ時間を減らすのに役立ちます。

アプリの OnStart プロパティで、 Concurrent を使用して、アプリがデータを読み込むときにパフォーマンスを向上させます。 前の呼び出しが完了するまで、データ呼び出しが開始されない場合、アプリはすべての要求時間の合計を待機する必要があります。 データ呼び出しが同時に開始される場合、アプリは最長の要求時間だけ待機する必要があります。 Web ブラウザーは、多くの場合、ネットワーク呼び出しを同時に実行することでパフォーマンスを向上させます。

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 ) ) evaluatesSet( a, 1 );Set( b, a+1 )Set( x, 2 )と同時に;Set( y, x+2 ). この場合、数式内の依存関係は問題がなく、ab の前に設定され、xy の前に設定されます。

アプリが実行されているデバイスまたはブラウザーによっては、実際には少数の数式しか同時に評価されない可能性があります。 Concurrent は使用可能な機能を使用し、すべての数式が評価されるまで完了しません。

数式レベルのエラー管理 (詳細設定) を有効にした場合、引数の順序で発生した最初のエラーがConcurrentから返されます。それ以外の場合は空白が返されます。 すべての数式が成功する場合、true が返されます。 1 つの数式が失敗した場合、その数式の残りの部分は停止しますが、他の数式は評価を続行します。

Concurrent、動作の数式でのみ使用できます。

構文

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

  • 数式 – 必須。 同時に評価する数式。 少なくとも 2 つの数式を指定する必要があります。

データの読み込みをより迅速にする

  1. アプリを作成し、Microsoft Dataverse、SQL Server、または SharePoint から 4 つのデータ ソースを追加します。

    この例では、SQL Azure のサンプル Adventure Works データベース から 4 つのテーブルを使用します。 データベースを作成したら、完全修飾サーバー名 (たとえば、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 Edge または Google Chrome で、アプリが実行されている間にネットワーク トラフィックを監視する開発者ツールをオンにします。

  4. (オプション) ネットワーク調整をオンにして、この比較の効果を強調します。

  5. Alt キーを押しながら、ボタンを選択し、次にネットワーク トラフィックを監視します。

    ツールには、次の例のように、順番に実行された 4 つの要求を示します。 実際の時間は、大きく異なるため削除されています。 グラフには、各呼び出しが最後の完了後に開始されることを示しています。

    この 4 つのネットワーク要求の時間グラフでは、それぞれが最後に終了した後に開始され、時間帯全体をカバーしています。

  6. アプリを保存し、閉じて、再度開きます。

    Power Apps はデータをキャッシュするので、ボタンを再度選択しても必ずしも 4 つの新しい要求が発生するわけではありません。 パフォーマンスをテストするたびに、アプリを閉じて再度開きます。 ネットワーク調整がオンになっている場合、別のテストの準備が終わるまでオフにしておくことができます。

  7. 2 番目の 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 キーを押しながら、2 番目のボタンを選択し、次にネットワーク トラフィックを確認します。

    ツールには、次の例のように、同時に実行された 4 つの要求を示します。 繰り返しますが、実際の時間は大きく異なるため削除されています。 グラフは、すべての呼び出しが約同時に開始され、前の呼び出しが完了するまで待機しないことを示しています。

    この 4 つのネットワーク要求の時間グラフでは、4 つのすべてが同時に開始され、時間帯の半分程度をカバーしています。

    これらのグラフは、同じスケールに基づいています。 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 プロパティを結果に設定します。

  5. 右側ペインのプロパティ タブで、フィールドの編集を選択してフィールド ペインを開きます。

  6. フィールドの一覧で、各フィールドのチェック ボックスを選択して、データ テーブルにすべて表示します。

  7. (オプション) 入力フィールドを一覧の上部にドラッグし、FrenchFaster フィールドを一覧の下部にドラッグします。

    結果コレクションのフィールドの一覧。

  8. Text input コントロールで、翻訳する語句を入力または貼り付けます。

  9. Alt キーを押しながら、ボタンを複数回選択して、テーブルを塗りつぶします。

    時間はミリ秒単位で表示されます。

    文字列「Hello World」をフランス語とドイツ語に翻訳した結果を含むデータ テーブルの表示。フランス語の翻訳がドイツ語よりも速い場合もあれば、その逆の場合もあります。

    場合によっては、フランス語翻訳はドイツ語よりも速い場合があり、その逆もあります。 どちらも同時に開始されますが、ネットワーク待ち時間やサーバー側の処理など、さまざまな理由で一方がもう一方の前に戻ります。

    アプリが最初に終了する翻訳に依存している場合、競合状態 が発生します。 しかし、Power Apps では検出できるほとんどのタイミング依存関係にフラグを付けます。