Chức năng đồng thời
Áp dụng cho: Ứng dụng Canvas Ứng dụng dựa trên mô hình
Đánh giá nhiều công thức cùng lúc.
Description
Hàm Concurrent cho phép đánh giá cùng lúc nhiều công thức được chỉ định trong cùng một thuộc tính nếu những công thức này có trình kết nối hoặc lệnh gọi Dataverse. Thông thường, ứng dụng đánh giá nhiều công thức bằng cách xâu chuỗi những công thức này lại với nhau bằng toán tử ; (dấu chấm phẩy) để đánh giá từng công thức theo tuần tự. Với hàm Concurrent, ứng dụng sẽ đánh giá đồng thời tất cả công thức thuộc cùng một thuộc tính ngay cả sau khi sử dụng toán tử ;. Mô hình đồng thời này giúp người dùng nhận được cùng một kết quả mà không phải đợi lâu.
Với thuộc tính OnStart của ứng dụng, hãy dùng Concurrent để cải thiện hiệu suất khi ứng dụng tải dữ liệu. Khi lệnh gọi dữ liệu chỉ bắt đầu khi lệnh gọi trước hoàn tất, ứng dụng phải chờ để có được tổng số lần yêu cầu. Nếu các lệnh gọi dữ liệu bắt đầu cùng một lúc, ứng dụng chỉ cần đợi lần yêu cầu lâu nhất. Trình duyệt web thường thực hiện đồng thời các lệnh gọi mạng để cải thiện hiệu suất.
Bạn không thể dự đoán thứ tự bắt đầu và kết thúc đánh giá các công thức trong hàm Concurrent. Các công thức trong hàm Concurrent không được chứa phần phụ thuộc vào các công thức khác trong cùng một hàm Concurrent và hàm Power Apps sẽ hiển thị lỗi nếu bạn cố gắng làm điều này. Từ bên trong, bạn có thể sử dụng phần phụ thuộc một cách an toàn vào các công thức bên ngoài hàm Concurrent bởi vì các công thức đó sẽ hoàn thành trước khi hàm Concurrent bắt đầu. Các công thức sau hàm Concurrent có thể sử dụng một cách an toàn những phần phụ thuộc vào các công thức bên trong: tất cả các công thức đó sẽ hoàn thành trước khi hàm Concurrent kết thúc và chuyển sang công thức tiếp theo trong chuỗi (nếu bạn sử dụng toán tử ;). Hãy cảnh giác với các phần phụ thuộc nếu bạn đang gọi các chức năng hoặc phương thức dịch vụ có tác dụng phụ.
Bạn có thể dùng toán tử ; giữa các đối số trong hàm Concurrent để nối các công thức với nhau. Ví dụ: hàm Concurrent( Set( a, 1 ); Set( b, a+1 ), Set( x, 2 ); Set( y, x+2 ) ) sẽ đánh giá Set( a, 1 ); Set( b, a+1 ) đồng thời với Set( x, 2 ); Set( y, x+2 ). Trong trường hợp này, các phần phụ thuộc trong công thức ổn: a sẽ được đặt trước b và x sẽ được đặt trước y.
Tùy thuộc vào thiết bị hoặc trình duyệt mà ứng dụng đang chạy, hàm chỉ thực sự đánh giá đồng thời một số ít công thức. Concurrent sử dụng các khả năng có sẵn và sẽ không hoàn tất cho đến khi tất cả các công thức được đánh giá.
Nếu bạn bật tùy chọn Formula-level error management (Quản lý lỗi cấp công thức) (trong phần cài đặt nâng cao), hàm Concurrent sẽ trả về lỗi đầu tiên gặp phải theo thứ tự đối số; nếu không thì hàm sẽ trả về blank. Nếu triển khai thành công tất cả các công thức, thì hàm sẽ trả về true. Nếu không thể triển khai một công thức, hàm sẽ dừng đánh giá phần còn lại của công thức này nhưng vẫn tiếp tục đánh giá các công thức khác.
Bạn chỉ có thể sử dụng hàm Concurrent trong các công thức hành vi.
Cú pháp
Đồng thời( Công thức 1, Công thức 2 [, ...] )
- Công thức – Bắt buộc. Các công thức cần đánh giá đồng thời. Bạn phải thêm ít nhất hai công thức.
Ví dụ
Tải dữ liệu nhanh hơn
Tạo một ứng dụng rồi thêm bốn nguồn dữ liệu từ Microsoft Dataverse, SQL Server hoặc SharePoint.
Ví dụ này sử dụng bốn bảng từ mẫu cơ sở dữ liệu Adventure Works trên SQL Azure. Sau khi bạn tạo cơ sở dữ liệu, hãy kết nối với cơ sở dữ liệu này từ Power Apps bằng tên máy chủ đủ điều kiện (ví dụ: srvname.database.windows.net):
Thêm tùy chọn kiểm soát Button rồi đặt thuộc tính OnSelect thành công thức sau:
ClearCollect( Product, '[SalesLT].[Product]' ); ClearCollect( Customer, '[SalesLT].[Customer]' ); ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ); ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' )
Trong Microsoft Edge hoặc Google Chrome, hãy bật công cụ dành cho nhà phát triển để giám sát lưu lượng truy cập mạng khi ứng dụng của bạn đang chạy.
(không bắt buộc) Bật tính năng điều chỉnh mạng để tăng cường hiệu quả của phép so sánh này.
Nhấn và giữ phím Alt, đồng thời chọn nút này rồi xem lưu lượng truy cập mạng.
Các công cụ hiển thị bốn yêu cầu được thực hiện liên tiếp, tương tự như ví dụ sau đây. Thời gian thực tế được loại bỏ để hạn chế thay đổi. Biểu đồ cho thấy mỗi lệnh gọi bắt đầu sau khi lệnh gọi trước kết thúc:
Lưu, đóng rồi mở lại cấu hình.
Power Apps lưu trữ dữ liệu trong bộ nhớ đệm. Vì vậy, khi chọn lại nút, không nhất thiết phải tạo bốn yêu cầu mới. Mỗi lần bạn muốn kiểm tra hiệu suất, hãy đóng rồi mở lại ứng dụng. Nếu đã bật tính năng điều chỉnh mạng, bạn có thể cần tắt tính năng này cho đến khi sẵn sàng thực hiện lượt kiểm tra khác.
Thêm công cụ điều khiển Button (Nút) thứ hai rồi đặt thuộc tính OnSelect của nút này thành công thức sau:
Concurrent( ClearCollect( Product, '[SalesLT].[Product]' ), ClearCollect( Customer, '[SalesLT].[Customer]' ), ClearCollect( SalesOrderDetail, '[SalesLT].[SalesOrderDetail]' ), ClearCollect( SalesOrderHeader, '[SalesLT].[SalesOrderHeader]' ) )
Lưu ý rằng bạn đã thêm cùng một lệnh gọi ClearCollect cho nút đầu tiên nhưng lần này, bạn đưa các lệnh đó vào hàm Concurrent và phân tách bằng dấu phẩy.
Xóa màn hình mạng trong trình duyệt.
Nếu trước đó, bạn đã sử dụng tính năng điều chỉnh mạng, thì hãy bật lại tính năng này.
Nhấn và giữ phím Alt, đồng thời chọn nút thứ hai rồi xem lưu lượng truy cập mạng.
Các công cụ hiển thị bốn yêu cầu được thực hiện đồng thời, tương tự như ví dụ sau đây. Thời gian thực tế cũng được loại bỏ để hạn chế thay đổi. Biểu đồ cho thấy rằng tất cả các lệnh gọi đều bắt đầu cùng một lúc và không đợi lệnh gọi trước kết thúc:
Những biểu đồ này dựa trên cùng một tỷ lệ. Khi sử dụng hàm Concurrent, bạn đã giảm được một nửa tổng thời gian để hoàn thành các thao tác này.
Lưu, đóng rồi mở lại cấu hình.
Điều kiện Race
Thêm kết nối tới dịch vụ Microsoft Translator vào ứng dụng của bạn.
Thêm công cụ điều khiển Text input (Nội dung nhập văn bản) rồi đổi tên thành TextInput1 nếu công cụ này hiện có tên khác.
Thêm công cụ điều khiển Button (Nút) rồi đặt thuộc tính OnSelect của nút này thành công thức sau:
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 } )
Thêm công cụ điều khiển Data table (Bảng dữ liệu), rồi đặt thuộc tính Items (Mục) thành Results.
Trên tab Properties (Thuộc tính) ở ngăn bên phải, hãy chọn Edit fields (Chỉnh sửa trường) để mở ngăn Fields (Trường).
Trong danh sách trường, hãy chọn hộp kiểm cho từng trường để hiển thị tất cả các trường đó trong bảng dữ liệu.
(không bắt buộc) Kéo trường Input lên đầu danh sách và kéo trường FrenchFaster xuống cuối danh sách.
Trong công cụ điều khiển Text input (Nội dung nhập văn bản), hãy nhập hoặc dán một cụm từ cần dịch.
Nhấn và giữ phím Alt, đồng thời chọn nút nhiều lần để điền vào bảng.
Thời gian hiển thị bằng mili giây.
Trong một số trường hợp, bản dịch tiếng Pháp nhanh hơn bản dịch tiếng Đức và ngược lại. Cả hai hàm đều bắt đầu cùng lúc, nhưng hàm này trả về kết quả nhanh hơn hàm kia vì nhiều lý do, bao gồm độ trễ mạng và quá trình xử lý phía máy chủ.
Điều kiện thực hiện sẽ xảy ra nếu ứng dụng phụ thuộc vào bản dịch hoàn thành trước. Thật may, Power Apps gắn cờ hầu hết phần phụ thuộc thời gian mà hàm có thể phát hiện.