2008-08-07 28 views
20

Tôi định lưu trữ tất cả các thiết lập cấu hình trong phần app.config của ứng dụng (sử dụng lớp ConfigurationManager.AppSettings). Khi người dùng thay đổi cài đặt bằng giao diện người dùng của ứng dụng (nhấp vào hộp kiểm, chọn nút radio, v.v.), tôi định viết những thay đổi đó cho số AppSettings. Đồng thời, trong khi chương trình đang chạy, tôi định truy cập vào AppSettings liên tục từ một quá trình sẽ liên tục xử lý dữ liệu. Các thay đổi đối với cài đặt thông qua giao diện người dùng cần phải ảnh hưởng đến việc xử lý dữ liệu trong thời gian thực, đó là lý do tại sao quy trình sẽ truy cập liên tục AppSettings.ConfigurationManager.AppSettings Concerns Performance

Đây có phải là ý tưởng hay về hiệu suất không? Sử dụng AppSettings được cho là "đúng cách" để lưu trữ và truy cập các cài đặt cấu hình khi viết ứng dụng .Net, nhưng tôi lo rằng phương pháp này không dành cho tải liên tục (ít nhất là về cài đặt được đọc liên tục).

Nếu có ai có kinh nghiệm với điều này, tôi sẽ đánh giá rất cao ý kiến ​​đóng góp.

Cập nhật: Tôi có lẽ nên làm rõ một vài điểm.

Đây không phải là ứng dụng web, vì vậy việc kết nối cơ sở dữ liệu với ứng dụng có thể quá mức cần thiết để lưu trữ cài đặt cấu hình. Đây là một ứng dụng Windows Forms.

Theo tài liệu MSDN, ConfigurationManager là để lưu trữ không chỉ cài đặt cấp ứng dụng, mà còn là cài đặt người dùng. (Đặc biệt quan trọng nếu, ví dụ, các ứng dụng được cài đặt như một ứng dụng phần độc quyền.)

Cập nhật 2: tôi chấp nhận câu trả lời lomaxx vì Properties không thực sự trông giống như một giải pháp tốt, mà không cần phải thêm bất kỳ các lớp bổ sung vào ứng dụng của tôi (chẳng hạn như cơ sở dữ liệu). Khi sử dụng Thuộc tính, nó đã thực hiện tất cả bộ nhớ đệm mà người khác đề xuất. Điều này có nghĩa là mọi thay đổi và lần đọc tiếp theo đều được thực hiện trong bộ nhớ, làm cho nó cực kỳ nhanh. Các thuộc tính chỉ ghi các thay đổi vào đĩa khi bạn nói rõ ràng. Điều này có nghĩa là tôi có thể thay đổi cài đặt cấu hình khi đang chạy trong thời gian chạy và sau đó chỉ thực hiện lưu cuối cùng vào đĩa khi chương trình thoát.

Chỉ để xác minh nó thực sự có thể xử lý tải tôi cần, tôi đã làm một số thử nghiệm trên máy tính xách tay của tôi và đã có thể làm 750.000 lần đọc và 7.500 viết mỗi giây bằng cách sử dụng Properties. Điều đó là quá xa và vượt xa những gì ứng dụng của tôi sẽ bao giờ thậm chí đến gần với nhu cầu mà tôi cảm thấy khá an toàn khi sử dụng Thuộc tính mà không ảnh hưởng đến hiệu suất.

Trả lời

8

vì bạn đang sử dụng ứng dụng winforms, nếu nó ở trong .net 2.0 thực sự có hệ thống cài đặt người dùng (được gọi là Thuộc tính) được thiết kế cho mục đích này. This article on MSDN có phần giới thiệu khá hay về điều này

Nếu bạn vẫn lo lắng về hiệu suất, hãy xem SQL Compact Edition tương tự như SQLite nhưng cung cấp của Microsoft mà tôi đã tìm thấy phát rất độc đáo với winforms và thậm chí khả năng make it work with Linq

1

Ai đó sửa tôi nếu tôi sai, nhưng tôi không nghĩ rằng AppSettings thường có nghĩa là được sử dụng cho các loại cài đặt cấu hình này. Thông thường bạn sẽ chỉ đặt trong các thiết lập vẫn còn khá tĩnh (chuỗi kết nối cơ sở dữ liệu, đường dẫn tệp, v.v.). Nếu bạn muốn lưu trữ các thiết lập người dùng tùy biến, sẽ tốt hơn nếu bạn tạo một tệp tùy chọn riêng biệt, hoặc lý tưởng lưu trữ các cài đặt đó trong cơ sở dữ liệu.

0

Tôi có thể hỏi lý do bạn không lưu cài đặt của người dùng trong cơ sở dữ liệu không?

Nói chung, tôi lưu các cài đặt ứng dụng được thay đổi rất thường xuyên trong phần appSettings (các bản ghi lỗi địa chỉ email mặc định được gửi đến, số phút sau khi bạn được tự động đăng xuất, vv) Phạm vi thực sự này là ứng dụng, không phải ở người dùng và thường được sử dụng cho cài đặt triển khai.

0

một điều tôi sẽ xem xét đó là lưu các cài đặt vào bộ đọc, sau đó xóa các cài đặt từ bộ đệm trên ghi để giảm thiểu số lượng tải thực tế mà máy chủ phải xử lý để xử lý appSettings.

Ngoài ra, nếu có thể, hãy xem việc chia nhỏ ứng dụngCài đặt thành configSections để bạn có thể đọc các cài đặt liên quan đến ghi và bộ nhớ cache. Đã nói tất cả điều đó, tôi sẽ xem xét nghiêm túc việc lưu trữ các giá trị này trong cơ sở dữ liệu vì bạn dường như đang lưu trữ tùy chọn người dùng chứ không phải cài đặt ứng dụng.

2

Kiểm tra SQLite, có vẻ như đây là một lựa chọn tốt cho trường hợp cụ thể này.

1

Tôi sẽ không sử dụng tệp cấu hình để lưu trữ dữ liệu người dùng. Sử dụng một db.

2

Dylan,

không sử dụng các tập tin ứng dụng cấu hình cho mục đích này, sử dụng một DB SQL (SQLite, MySQL, MSSQL, bất cứ điều gì) vì bạn sẽ phải lo ngại hơn về vấn đề đồng thời trong đọc và ghi vào tập tin cấu hình.

Bạn cũng sẽ linh hoạt hơn trong loại dữ liệu bạn muốn lưu trữ. Phần appSettings chỉ là một danh sách khóa/giá trị mà bạn có thể tăng dần khi thời gian trôi qua và khi ứng dụng phát triển. Bạn có thể sử dụng các phần cấu hình tùy chỉnh nhưng sau đó bạn vào một khu vực vấn đề mới khi nói đến thiết kế.

2

AppSettings không thực sự có ý nghĩa cho những gì bạn đang cố gắng làm.

Khi ứng dụng .NET của bạn bắt đầu, nó đọc trong tệp app.config và lưu trữ nội dung của nó trong bộ nhớ. Vì lý do đó, sau khi bạn ghi vào tệp app.config, bạn sẽ phải bằng cách nào đó buộc thời gian chạy để phân tích cú pháp tệp app.config để nó có thể lưu lại các cài đặt. Điều này là không cần thiết

cách tiếp cận tốt nhất sẽ sử dụng cơ sở dữ liệu để lưu trữ cài đặt cấu hình của bạn.

Chặn việc sử dụng cơ sở dữ liệu, bạn có thể dễ dàng thiết lập tệp cấu hình XML bên ngoài. Khi ứng dụng của bạn bắt đầu, bạn có thể cache nội dung của nó trong đối tượng NameValueCollection hoặc đối tượng HashTable. Khi bạn thay đổi/thêm cài đặt, bạn sẽ làm điều đó với bản sao được lưu trong bộ nhớ cache đó. Khi ứng dụng của bạn tắt hoặc vào khoảng thời gian thích hợp, bạn có thể ghi lại nội dung bộ nhớ cache ra tệp.