Khi giao dịch với đơn trên Azure Chức năng, có một số cân nhắc. Một là trạng thái toàn cầu là được chia sẻ giữa các lời gọi AF. Vì vậy, nếu một hàm được gọi một lần và sau đó một lần nữa sau đó (đủ nhanh để máy chủ lưu trữ không dỡ mã của bạn), thì việc khởi tạo chỉ xảy ra một lần. Một lưu ý khác là AF là hoàn toàn miễn phí để bắt đầu nhiều lệnh gọi AF đồng thời - vì vậy bất kỳ người dùng đơn lẻ nào cần phải là luồng an toàn (kể cả khởi tạo của chúng).
Điều này có nghĩa là bạn sẽ muốn sử dụng Lazy<T>
/AsyncLazy<T>
. Tuy nhiên, lưu ý rằng AF (với các loại này) sẽ giữ trạng thái đơn (sau khởi tạo) cho lần gọi tiếp theo của bạn ngay cả khi nó không thành công. Đây có thể là một vấn đề đặc biệt với điện toán đám mây bởi vì nếu có lỗi mạng (hoặc cấu hình) khi AF của bạn khởi động, bạn muốn khởi tạo lại để thử lại lệnh gọi AF tiếp theo.
Kết luận, bạn muốn sử dụng Lazy<T>
/AsyncLazy<T>
theo cách sao cho an toàn chủ đề và không bảo toàn được lỗi.
Với Lazy<T>
, điều này có nghĩa you have to use the LazyThreadSafetyMode.PublicationOnly
flagvà vượt qua một chức năng để các nhà xây dựng (không chỉ ngầm sử dụng constructor mặc định cho T
). Lưu ý rằng điều này có nghĩa là bạn cần đảm bảo rằng hàm khởi tạo của bạn chính là luồng an toàn vì nó có thể được thực thi bởi nhiều luồng cùng một lúc.
Với AsyncLazy<T>
, you have to use the AsyncLazyFlags.RetryOnFailure
flag. Vì AsyncLazy<T>
về bản chất là một Lazy<Task<T>>
, tác vụ khởi tạo không đồng bộ được "chia sẻ" trong số tất cả người gọi đồng thời, và sau đó được thay thế bằng nguyên tử với phiên bản Lazy<Task<T>>
mới nếu nó không thành công. Vì vậy, hàm khởi tạo không đồng bộ không cần phải là luồng an toàn.
Kể từ khi nhận được tất cả điều này đúng (đặc biệt đối với nhiều độc thân) được thay sao chép và pasteish, tôi trừu tượng này ra cho the AF project I'm working on:
Mất một lúc để đến thời điểm này, nhưng tôi rất hài lòng với cách nó được bật ra. Ý nghĩa của blog về điều này cũng vậy ...
Nguồn
2017-09-28 21:12:43
Sử dụng Lazy <> hoặc AsyncLazy <> cùng với các thuộc tính tĩnh giúp giảm thiểu bất kỳ vấn đề luồng tiềm ẩn nào –