2009-04-13 34 views
9

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)?

Trả lời

5

Ví dụ được trả về từ GetSection không an toàn chỉ. Điều đó có nghĩa là bạn cần phải thêm mã khóa để sử dụng nó trong singleton của bạn.

Nhiều cuộc gọi không phân tích lại tệp, trừ khi tệp đã thay đổi. Dữ liệu được lưu trữ trong bộ nhớ.

Vấn đề an toàn chủ đề của bạn có thể dễ dàng được giải quyết bằng cách sử dụng khóa (Tôi không chắc chắn bạn sẽ cần, trừ khi bạn thay đổi cấu hình lúc chạy) và không có vấn đề về hiệu suất.

+0

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. –

0

ConfigurationManager.GetSection (chuỗi) là thành viên tĩnh công cộng và kể từ msdn tuyên bố 'Mọi thành viên tĩnh công cộng (Được chia sẻ trong Visual Basic) thuộc loại này đều an toàn', bạn có thể cho rằng sử dụng an toàn.

Đối với hiệu suất, tôi muốn sẵn sàng giả định rằng MS đã làm cho nó khá hiệu quả đã và chỉ cần sử dụng chức năng của họ như là. Hãy nhớ rằng: tối ưu hóa sớm là gốc rễ của cái ác.

Các vấn đề liên quan