Có một phương pháp dễ dàng truy cập dữ liệu cấu hình dựa trên System.Configuration tùy chỉnh thông qua giao diện an toàn thread mà không yêu cầu mỗi bối cảnh thực thi tải/tải lại thông tin cấu hình có tính toán không?Chủ đề sử dụng an toàn của System.Configuration
lớp System.Configuration, giống như hầu hết (tất cả?) Các lớp khác trong tài liệu thư viện Net của Microsoft, được chú thích với các thông tin thread-an toàn sau:
Bất kỳ public static (chung trong Visual Basic) thành viên loại này là chủ đề an toàn. Bất kỳ thành viên cá thể nào cũng không được bảo đảm là chuỗi an toàn.
Bằng cách đọc sách của tôi điều này, ConfigurationSection
đối tượng trở về từ các ConfigurationManager.GetSection(string)
và các phương pháp tương tự (ví dụ OpenExeConfiguration(string exePath).GetSection(string)
) không được giả định là thread-safe và do đó không nên được sử dụng bởi nhiều ngữ cảnh thực hiện. Điều này cấm lưu trữ ConfigurationSection
trong một singleton mà nếu không sẽ được thread-an toàn bởi vì trong khi truy cập vào đối tượng phần có thể được an toàn, các thành viên trên đối tượng chính nó là không an toàn. Tuy nhiên, nhiều cuộc gọi đến GetSection
có thể yêu cầu phân tích cú pháp lại các tệp cấu hình và phân bổ các trường hợp ConfigurationSection
mới có chi phí cao xem xét cấu hình không có khả năng thay đổi sau khi khởi tạo. Hơn nữa, việc sao chép dữ liệu cấu hình vào một đối tượng khác đã làm an toàn thread dường như đánh bại một trong những lợi ích chính của việc sử dụng gói cấu hình tích hợp ngay từ đầu (dễ truy cập vào thông tin cấu hình đã được chuyển đổi và xác thực mà không cần nhiều bản mẫu) mã).
Vì vậy, có cách nào để sử dụng System.Configuration
theo cách an toàn mà không phải dùng đến phân tích cú pháp và phân bổ quá nhiều phần cấu hình không? Không thực hiện tự do ConfigurationSection
miễn phí của bạn từ sự thiếu bảo đảm được cung cấp bởi Microsoft mặc dù bạn đang truy cập nó thông qua giao diện System.Configuration
(và nếu vậy, bạn sẽ thực hiện nó như thế nào để an toàn chỉ khi truy cập vào chỉ mục của cơ sở ConfigurationSection
là cần thiết để truy cập dữ liệu được cấu hình)?
Tôi đã gặp sự cố máy chủ IIS một cách ngẫu nhiên trong 5 tháng qua vì điều này. Đã không có ý tưởng tại sao (crash là một tràn ngăn xếp trong MSCorLib) cho đến khi nó xảy ra trên máy dev của tôi, và một cuộc gọi ứng dụng đã gây ra nó. Tôi nghĩ rằng điều này trả lời câu hỏi của tôi. Cảm ơn. –