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 ) ) は Set( a, 1 ); Set( b, a+1 ) を Set( x, 2 ); Set( y, x+2 ) と同時に評価します。 この場合、数式内の依存関係は問題がなく、a は b の前に設定され、x は y の前に設定されます。
アプリが実行されているデバイスまたはブラウザーによっては、実際には少数の数式しか同時に評価されない可能性があります。 Concurrent は利用可能な機能を使用し、すべての数式が評価されるまで終了しません。
数式レベルのエラー管理を (詳細設定で) 有効にする場合、引数の順序で最初に発生したエラーはConcurrentから返され、それ以外の場合は、空白が返されます。 すべての数式が成功する場合、true が返されます。 1 つの数式が失敗した場合、その数式の残りの部分は停止しますが、他の数式は評価を続行します。
Concurrentは、動作の数式 でのみ使用できます。
構文
同時( Formula1, Formula2 [, ...] )
- 数式 – 必須。 同時に評価する数式。 少なくとも 2 つの数式を指定する必要があります。
例
データの読み込みをより迅速にする
アプリを作成し、Microsoft Dataverse、SQL Server、または SharePoint から 4 つのデータ ソースを追加します。
この例では、SQL Azure のサンプル Adventure Works データベース から 4 つのテーブルを使用します。 データベースを作成したら、完全修飾サーバー名 (たとえば、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 キーを押しながら、ボタンを選択し、次にネットワーク トラフィックを監視します。
ツールには、次の例のように、順番に実行された 4 つの要求を示します。 実際の時間は大幅に異なるため、削除されています。 グラフには、各呼び出しが最後の完了後に開始されることを示しています。
アプリを保存し、閉じて、再度開きます。
Power Apps はデータをキャッシュするので、ボタンを再度選択しても必ずしも 4 つの新しい要求が発生するわけではありません。 パフォーマンスをテストするたびに、アプリを閉じて再度開きます。 ネットワーク調整がオンになっている場合、別のテストの準備が終わるまでオフにしておくことができます。
2 番目の Button コントロールを追加し、OnSelect プロパティを次の数式に設定します。
Concurrent( ClearCollect( Product, '[SalesLT].[Product]' ), ClearCollect( Customer, '[SalesLT].[Customer]' ), ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ), ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' ) )
最初のボタンに同じ ClearCollect 呼び出しを追加しましたが、今回は Concurrent 関数で囲まれ、コンマで区切られていることに注意してください。
ブラウザーでネットワーク監視をクリアにします。
ネットワーク調整を以前に使用していた場合は、再度オンにします。
Alt キーを押しながら、2 番目のボタンを選択し、次にネットワーク トラフィックを確認します。
ツールには、次の例のように、同時に実行された 4 つの要求を示します。 この場合も、実際の時間は大幅に異なるため、削除されています。 グラフには、すべての呼び出しがほぼ同時に開始され、および前の呼び出しが終了するまで待機していないことを示しています。
これらのグラフは、同じスケールに基づいています。 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 プロパティを結果に設定します。
右側ペインのプロパティ タブで、フィールドの編集を選択してフィールド ペインを開きます。
フィールドの一覧で、各フィールドのチェック ボックスを選択して、データ テーブルにすべて表示します。
(オプション) 入力フィールドを一覧の上部にドラッグし、FrenchFaster フィールドを一覧の下部にドラッグします。
Text input コントロールで、翻訳する語句を入力または貼り付けます。
Alt キーを押しながら、ボタンを複数回選択して、テーブルを塗りつぶします。
時間はミリ秒単位で表示されます。
場合によっては、フランス語翻訳はドイツ語よりも速い場合があり、その逆もあります。 両方が同時に開始されますが、ネットワークの待機時間およびサーバー側の処理などの、さまざまな理由で一方が他方の前に返されます。
アプリが最初に終了する翻訳に依存している場合、競合状態 が発生します。 しかし、Power Apps では検出できるほとんどのタイミング依存関係にフラグを付けます。