Funkcja Concurrent w usłudze PowerAppsConcurrent function in PowerApps

Oblicza wiele formuł jednocześnie.Evaluates multiple formulas concurrently with one another.

OpisDescription

Funkcja Concurrent oblicza wiele formuł w tym samym czasie.The Concurrent function evaluates multiple formulas at the same time. Zwykle wiele formuł jest ocenianych przez łączenie ich razem z operatorem ; , który ocenia każdy sekwencyjnie w kolejności.Normally, multiple formulas are evaluated by chaining them together with the ; operator, which evaluates each sequentially in order. Gdy aplikacja wykonuje operacje jednocześnie, czas oczekiwania użytkowników na ten sam wynik jest krótszy.When the app performs operations concurrently, users wait less for the same result.

Używając funkcji Concurrent w ramach właściwości OnStart, można zwiększyć wydajność aplikacji podczas ładowania danych.In the OnStart property of your app, use Concurrent to improve performance when the app loads data. 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ń.When data calls don't start until the previous calls finish, the app must wait for the sum of all request times. Jeśli wywołania danych są uruchamiane jednocześnie, czas oczekiwania aplikacji zostanie skrócony do najdłużej wykonywanego żądania.If data calls start at the same time, the app needs to wait only for the longest request time. Przeglądarki internetowe często zwiększają wydajność, wykonując jednocześnie wiele operacji na danych.Web browsers often improve performance by performing data operations concurrently.

Nie można przewidzieć, która formuła będzie pierwszą lub ostatnią formułą obliczaną przez funkcję Concurrent.You can't predict the order in which formulas within the Concurrent function start and end evaluation. Formuły w obrębie funkcji Concurrent nie powinny być zależne od innych formuł w ramach funkcji Concurrent. W przeciwnym razie usługa PowerApps pokaże błąd.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. 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.From within, you can safely take dependencies on formulas outside the Concurrent function because they will complete before the Concurrent function starts. Formuły po funkcji współbieżności mogą bezpiecznie przyjmować zależności od formuł w: wszystkie te wszystkie zostaną wykonane przed zakończeniem funkcji współbieżności i przeniesiemy do następnej formuły w łańcuchu (Jeśli używasz operatora ; ).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 ; operator). 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.Watch out for subtle order dependencies if you're calling functions or service methods that have side effects.

Można łączyć formuły z operatorem ; w argumencie do współbieżności.You can chain formulas together with the ; operator within an argument to Concurrent. 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 ) .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 ). W tym przypadku zależności formuł są poprawne: a zostanie ustawione przed b, a x zostanie ustawione przed y.In this case, the dependencies within the formulas are fine: a will be set before b, and x will be set before 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ł.Depending on the device or browser in which the app is running, only a handful of formulas might actually be evaluated concurrently. Funkcja Concurrent korzysta z dostępnych możliwości i działa tak długo, dopóki wszystkie formuły nie zostaną obliczone.Concurrent uses the available capabilities and won't finish until all formulas have been evaluated.

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.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. Jeśli wszystkie formuły zostaną obliczone pomyślnie, zwracana jest wartość true.If all formulas are successful, true is returned. Jeśli jedna formuła nie powiedzie się, wykonywanie jej pozostałej części zostanie zatrzymane, ale inne formuły nadal będą obliczane.If one formula fails, the rest of that formula stops, but other formulas continue evaluating.

Funkcji Concurrent można używać tylko w formułach dotyczących zachowań.You can use Concurrent only in behavior formulas.

SkładniaSyntax

Concurrent( Formuła1; Formuła2 [; ...] )Concurrent( Formula1; Formula2 [; ...] )

  • Formuła — wartości wymagane.Formula(s) – Required. Formuły do jednoczesnego obliczenia.Formulas to evaluate concurrently. Należy podać co najmniej dwie formuły.You must supply at least two formulas.

PrzykładyExamples

Szybsze ładowanie danychLoading data faster

  1. Utwórz aplikację i Dodaj cztery źródła danych z Common Data Service, SQL Server lub SharePoint.Create an app, and add four data sources from Common Data Service, SQL Server, or SharePoint.

    W tym przykładzie użyto czterech tabel z przykładowej bazy danych firmy Adventure Works w usłudze Azure SQL.This example uses four tables from the sample Adventure Works database on SQL Azure. Po utworzeniu bazy danych połącz się z nią w usłudze PowerApps za pomocą w pełni kwalifikowanej nazwy serwera (na przykład srvname.database.windows.net):After you create the database, connect to it from PowerApps using the fully qualified server name (for example, srvname.database.windows.net):

    Nawiązywanie połączenia z bazą danych firmy Adventure Works na platformie Azure

  2. Dodaj kontrolkę Przycisk i ustaw jej właściwość OnSelect na następującą formułę: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]' )
    
  3. W przeglądarce Microsoft Edge lub Google Chrome włącz narzędzia deweloperskie w celu monitorowania ruchu sieciowego, gdy aplikacja jest uruchomiona.In Microsoft Edge or Google Chrome, turn on developer tools to monitor network traffic while your app is running.

  4. (opcjonalnie) Włącz funkcję ograniczania użycia sieci w celu wyolbrzymienia skutków tego porównania.(optional) Turn on network throttling to exaggerate the effects of this comparison.

  5. Trzymając naciśnięty klawisz Alt, wybierz przycisk, a następnie obserwuj ruch sieciowy.While holding down the Alt key, select the button, and then watch the network traffic.

    Narzędzia pokazują cztery żądania wykonywane seriami podobne do tego przykładu.The tools show four requests performed in series, similar to this example. Rzeczywisty czas został usunięty ze względu na możliwe występowanie znacznych różnic w czasie wykonywania wywołań.Actual times have been removed as they will vary wildly. Na wykresie widać, że każde wywołanie rozpoczyna się po zakończeniu poprzedniego:The graph shows that each call starts after the last has finished:

    Wykres czasowy czterech żądań sieciowych — wykonywanie każdego żądania rozpoczyna się po zakończeniu poprzedniego i obejmuje cały przedział czasu

  6. Zapisz, zamknij i ponownie otwórz aplikację.Save, close, and reopen the app.

    Usługa PowerApps zapisuje dane w pamięci podręcznej, dlatego ponowne wybranie przycisku nie zawsze będzie skutkować pojawieniem się czterech nowych żądań.PowerApps caches data, so selecting the button again won't necessarily cause four new requests. Za każdym razem, gdy chcesz przetestować wydajność, zamknij i ponownie otwórz aplikację.Each time you want to test performance, close and reopen your app. Jeśli funkcja ograniczania użycia sieci została włączona, można ją wyłączyć do momentu przeprowadzenia kolejnego testu.If you turned network throttling on, you may want to turn it off until you're ready for another test.

  7. Dodaj drugą kontrolkę Przycisk i ustaw jej właściwość OnSelect na następującą formułę: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]' )
    )
    

    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.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. Wyczyść monitor sieci w przeglądarce.Clear the network monitor in the browser.

  9. Jeśli funkcja ograniczania użycia sieci była używana wcześniej, włącz ją ponownie.If you were using network throttling before, turn it on again.

  10. Trzymając naciśnięty klawisz Alt, wybierz drugi przycisk, a następnie obejrzyj ruch sieciowy.While holding down the Alt key, select the second button, and then watch the network traffic.

    Narzędzia pokazują cztery żądania wykonywane jednocześnie podobne do tego przykładu.The tools show four requests performed concurrently, similar to this example. Rzeczywisty czas został ponownie usunięty ze względu na możliwe występowanie znacznych różnic w czasie wykonywania wywołań.Again, actual times have been removed as they will vary wildly. Wykres pokazuje, że wszystkie wywoływania rozpoczynają się niemal w tym samym czasie i nie czekają na zakończenie poprzedniego:The graph shows that all the calls start at about the same time and do not wait for the previous one to finish:

    Wykres czasowy czterech żądań sieciowych — wszystkie żądania zostały uruchomione jednocześnie i obejmują prawie połowę przedziału czasu

    Wszystkie elementy wykresu oparto na tej samej skali.These graphs are based on the same scale. Za pomocą funkcji Concurrent udało się skrócić o połowę czas przeprowadzania operacji.By using Concurrent, you halved the total amount of time these operations took to finish.

  11. Zapisz, zamknij i ponownie otwórz aplikację.Save, close, and reopen the app.

Sytuacja wyściguRace condition

  1. Dodaj do aplikacji połączenie z usługą Microsoft Translator.Add a connection to the Microsoft Translator service to your app.

  2. Dodaj kontrolkę Wprowadzanie tekstu i zmień jej nazwę na TextInput1, jeśli ma inną nazwę.Add a Text input control, and rename it TextInput1 if it has a different name.

  3. Dodaj kontrolkę Przycisk i ustaw jej właściwość OnSelect na następującą formułę: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
        }
    )
    
  4. Dodaj kontrolkę Tabela danych i ustaw jej właściwość Items na Results.Add a Data table control, and set its Items property to Results.

  5. Na karcie Właściwości w okienku po prawej stronie wybierz pozycję Edytuj pola , aby otworzyć okienko pola .On the Properties tab of the right pane, select Edit fields to open the Fields pane.

  6. Na liście pól zaznacz wszystkie pola, aby wyświetlić je w tabeli danych.In the list of fields, select the check box for each field to show them all in the data table.

  7. (opcjonalnie) Przeciągnij pole Input na początek listy, a następnie przeciągnij pole FrenchFaster na dół listy.(optional) Drag the Input field to the top of the list, and drag the FrenchFaster field to the bottom of the list.

    Lista pól w kolekcji Result

  8. W kontrolce Wprowadzanie tekstu wpisz lub wklej frazę, która ma zostać przetłumaczona.In the Text input control, type or paste a phrase to translate.

  9. Trzymając naciśnięty klawisz Alt, kliknij wielokrotnie przycisk w celu wypełnienia tabeli.While holding down the Alt key, select the button multiple times to fill the table.

    Czas podawany jest w milisekundach.The times are shown in milliseconds.

    Wyświetlanie tabeli danych zawierającej wynik tłumaczenia ciągu „Hello world” na język francuski i niemiecki.

    W niektórych przypadkach francuskie tłumaczenie jest wykonywane szybciej od niemieckiego tłumaczenia i na odwrót.In some cases, the French translation is faster than the German translation, and vice versa. 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.Both start at the same time, but one returns before the other for a variety of reasons, including network latency and server-side processing.

    Sytuacja wyścigu może wystąpić, jeśli działanie aplikacji jest uzależnione od pojawienia się któregoś tłumaczenia jako pierwszego.A race condition would occur if the app depended on one translation ending first. Na szczęście usługa PowerApps flaguje większość zależności czasu, które potrafi wykryć.Fortunately, PowerApps flags most timing dependencies that it can detect.