Funkcja Concurrent
Dotyczy: Aplikacje kanwy Aplikacje oparte na modelu
Oblicza wiele formuł jednocześnie.
opis
Funkcja Concurrent umożliwia jednoczesne szacowanie wielu formuł określonych w ramach tej samej właściwości, jeśli mają one wywołania łącznika lub Dataverse. Zwykle wiele formuł oblicza się, łącząc je ze sobą za pomocą operatora ; (średnik), który ocenia każdą formułę sekwencyjnie. Dzięki funkcji Współbieżne aplikacja będzie oceniać wszystkie formuły we właściwości jednocześnie, nawet po użyciu ; operator. Ta współbieżność pomoże użytkownikom krócej czekać na ten sam wynik.
Używając funkcji Concurrent w ramach właściwości OnStart, można zwiększyć wydajność aplikacji podczas ładowania danych. Jeśli kolejne wywołania danych nie są uruchamiane przed zakończeniem poprzednich, aplikacja musi czekać przez czas będący sumą czasów wszystkich żądań. Jeśli wywołania danych są uruchamiane jednocześnie, czas oczekiwania aplikacji zostanie skrócony do najdłużej wykonywanego żądania. Przeglądarki internetowe często poprawiają wydajność, wykonując jednocześnie połączenia sieciowe.
Nie można przewidzieć, która formuła będzie pierwszą lub ostatnią formułą obliczaną przez funkcję Concurrent. Formuły w obrębie funkcji Concurrent nie powinny być zależne od innych formuł w ramach funkcji Concurrent. W przeciwnym razie usługa Power Apps pokaże błąd. We wnętrzu funkcji Concurrent można bezpiecznie używać zależności od formuł spoza niej, ponieważ zostaną one wykonane przed uruchomieniem funkcji Concurrent. Formuły występujące za funkcją Concurrent mogą być zależne od formuł wewnątrz niej, ponieważ wszystkie zostaną wykonane przed zakończeniem działania funkcji Concurrent i przejściem do następnej formuły w łańcuchu (jeśli użyto operatora ;). Należy zwrócić uwagę na drobne zależności dotyczące kolejności wywoływania funkcji lub metod usługi, które mają skutki uboczne.
W funkcji Concurrent formuły można łączyć za pomocą operatora ;. Na przykład funkcja Concurrent( Set( a, 1 ); Set( b, a+1 ), Set( x, 2 ); Set( y, x+2 ) ) oblicza jednocześnie dwa elementy: Set( a, 1 ); Set( b, a+1 ) i Set( x, 2 ); Set( y, x+2 ). W tym przypadku zależności formuł są poprawne: a zostanie ustawione przed b, a x zostanie ustawione przed y.
W zależności od urządzenia lub przeglądarki, w której aplikacja jest uruchamiana, jednoczesne obliczanie może dotyczyć tylko niewielkiej liczby formuł. Współbieżne korzysta z dostępnych możliwości i nie zakończy się, dopóki wszystkie formuły nie zostaną ocenione.
Po włączeniu opcji Błąd zarządzania na poziomie formuły (w ustawieniach zaawansowanych) zwracany jest pierwszy błąd napotkany przez funkcję Concurrent – w przeciwnym razie zwracana jest wartość puste. Jeśli wszystkie formuły zostaną obliczone pomyślnie, zwracana jest wartość true. Jeśli jedna formuła nie powiedzie się, wykonywanie jej pozostałej części zostanie zatrzymane, ale inne formuły nadal będą obliczane.
Funkcji Concurrent można używać tylko w formułach dotyczących zachowań.
Składnia
Współbieżny( Formuła1,Formuła2 [, ...] )
- Formuły – Wymagane. Formuły do jednoczesnego obliczenia. Należy podać co najmniej dwie formuły.
Przykłady
Szybsze ładowanie danych
Utworzenie aplikacji i dodanie czterech źródeł danych z programu Microsoft Dataverse, SQL Server lub SharePoint.
W tym przykładzie użyto czterech tabel z przykładowej bazy danych firmy Adventure Works w usłudze Azure SQL. Po utworzeniu bazy danych połącz się z nią w usłudze Power Apps za pomocą w pełni kwalifikowanej nazwy serwera (na przykład srvname.database.windows.net):
Dodaj kontrolkę Button i ustaw jej właściwość OnSelect na następującą formułę:
ClearCollect( Product, '[SalesLT].[Product]' ); ClearCollect( Customer, '[SalesLT].[Customer]' ); ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ); ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )
W przeglądarce Microsoft Edge lub Google Chrome, włącz narzędzia deweloperskie w celu monitorowania ruchu sieciowego, gdy aplikacja jest uruchomiona.
(opcjonalnie) Włącz funkcję ograniczania użycia sieci w celu wyolbrzymienia skutków tego porównania.
Trzymając naciśnięty klawisz Alt, wybierz przycisk, a następnie obserwuj ruch sieciowy.
Narzędzia pokazują cztery żądania wykonywane seriami podobne do tego przykładu. Rzeczywisty czas został usunięty ze względu na możliwe występowanie znacznych różnic w czasie wykonywania wywołań. Na wykresie widać, że każde wywołanie rozpoczyna się po zakończeniu poprzedniego:
Zapisz, zamknij i ponownie otwórz aplikację.
Usługa Power Apps zapisuje dane w pamięci podręcznej, dlatego ponowne wybranie przycisku nie zawsze będzie skutkować pojawieniem się czterech nowych żądań. Za każdym razem, gdy chcesz przetestować wydajność, zamknij i ponownie otwórz aplikację. Jeśli funkcja ograniczania użycia sieci została włączona, można ją wyłączyć do momentu przeprowadzenia kolejnego testu.
Dodaj drugą kontrolkę Button i ustaw jej właściwość OnSelect na następującą formułę:
Concurrent( ClearCollect( Product, '[SalesLT].[Product]' ), ClearCollect( Customer, '[SalesLT].[Customer]' ), ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ), ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' ) )
Należy zwrócić uwagę na to, że takie same wywołania ClearCollect zostały dodane do pierwszego przycisku, ale w tym przypadku zostały one opakowane funkcją Concurrent i rozdzielone przecinkami.
Wyczyść monitor sieci w przeglądarce.
Jeśli funkcja ograniczania użycia sieci była używana wcześniej, włącz ją ponownie.
Trzymając naciśnięty klawisz Alt, wybierz drugi przycisk, a następnie obejrzyj ruch sieciowy.
Narzędzia pokazują cztery żądania wykonywane jednocześnie podobne do tego przykładu. Rzeczywisty czas został ponownie usunięty ze względu na możliwe występowanie znacznych różnic w czasie wykonywania wywołań. Wykres pokazuje, że wszystkie wywoływania rozpoczynają się niemal w tym samym czasie i nie czekają na zakończenie poprzedniego:
Wszystkie elementy wykresu oparto na tej samej skali. Za pomocą funkcji Concurrent udało się skrócić o połowę czas przeprowadzania operacji.
Zapisz, zamknij i ponownie otwórz aplikację.
Sytuacja wyścigu
Dodaj połączenie z usługą Microsoft Translator do swojej aplikacji.
Dodaj kontrolkę Text input i zmień jej nazwę na TextInput1, jeśli ma inną nazwę.
Dodaj kontrolkę Button i ustaw jej właściwość OnSelect na następującą formułę:
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 } )
Dodaj kontrolkę Data table i ustaw jej właściwość Items na Results.
Na karcie Właściwości okienka po prawej stronie wybierz pozycję Edytuj pola, aby otworzyć okienko Pola.
Na liście pól zaznacz wszystkie pola, aby wyświetlić je w tabeli danych.
(opcjonalnie) Przeciągnij pole Dane wejściowe na początek listy, a następnie przeciągnij pole FrenchFaster na dół listy.
W kontrolce Text input wpisz lub wklej frazę, która ma zostać przetłumaczona.
Trzymając naciśnięty klawisz Alt, kliknij wielokrotnie przycisk w celu wypełnienia tabeli.
Czas podawany jest w milisekundach.
W niektórych przypadkach francuskie tłumaczenie jest wykonywane szybciej od niemieckiego tłumaczenia i na odwrót. Tłumaczenie obu fraz rozpoczyna się w tym samym czasie, ale jedna jest zwracana wcześniej od drugiej z różnych powodów, takich jak opóźnienie sieci i przetwarzanie po stronie serwera.
Sytuacja wyścigu może wystąpić, jeśli działanie aplikacji jest uzależnione od pojawienia się któregoś tłumaczenia jako pierwszego. Na szczęście usługa Power Apps flaguje większość zależności czasu, które potrafi wykryć.