2012-04-16 36 views
5

Chỉ cần một câu hỏi chung, tôi đang phát triển một ứng dụng ASP.NET MVC 3 web mà đọc từ một tập tin cấu hình sử dụng Stream đọc bên trong một tuyên bố dùng để xử lý tự động như sau:Lo ngại về sự bế tắc với C# StreamReader

using (StreamReader sr = new StreamReader(filepath)) 
{ 

} 

Quan tâm của tôi là khi nhiều người dùng đang chạy ứng dụng, một bế tắc sẽ xảy ra khi nhiều phiên bản của ứng dụng đang đọc các giá trị từ tệp cấu hình. Câu hỏi của tôi là, deadlocks có phải là vấn đề khi làm việc với lớp Stream Reader không? Trực giác tôi nghĩ không, vì tôi giả định Trình đọc luồng đang mở tệp ở chế độ chỉ đọc và không có quy trình bên ngoài nào ghi vào tệp cấu hình ngoài các chỉnh sửa thủ công. Tôi chỉ muốn chắc chắn liệu đây có phải là một vấn đề hay không. Bất kỳ cái nhìn sâu sắc được đánh giá cao.

Trả lời

8

mối quan tâm của tôi là khi nhiều người dùng đang chạy các ứng dụng, một bế tắc sẽ xảy ra khi nhiều trường hợp của các ứng dụng đang giá trị đọc từ tập tin cấu hình

Không, đừng lo lắng. Không có bế tắc nào xảy ra. Bạn đang mở tệp để đọc. Vì vậy, bạn có thể có độc giả đồng thời. Nhưng nếu bạn viết vào tập tin này ở một số vị trí khác của mã của bạn, bạn sẽ nhận được một ngoại lệ. Nhưng không có bế tắc. Nếu bạn muốn đồng bộ hóa đúng trình đọc và người viết cho một số tài nguyên được chia sẻ, chẳng hạn như tệp bạn có thể sử dụng lớp ReaderWriterLockSlim. Nếu bạn không bao giờ viết vào tập tin (từ cùng một quá trình hoặc một số quá trình khác) thì bạn vẫn ổn. Nhưng nếu bạn không bao giờ ghi vào tập tin, để tránh đọc và phân tích cú pháp tập tin này mọi lúc, bạn chỉ nên đọc nó một lần và lưu nó vào một số cấu trúc bộ nhớ. Ví dụ đó là cách hệ thống cấu hình ứng dụng .NET hoạt động. Nó đọc và phân tích cú pháp ứng dụng/web.config một lần khi chạy ứng dụng và sau đó lưu nó vào bộ nhớ để truy cập nhanh hơn. Nhưng tất nhiên mọi thứ sẽ phụ thuộc vào kịch bản chính xác của bạn.

+1

Ngoài ra, nếu bạn thực sự quan tâm đến nhiều người đang đọc tệp cấu hình này, bạn nên đọc nó một lần trong khu vực an toàn của luồng và sau đó lưu vào bộ nhớ cache để sử dụng trong tương lai. – Tejs

+0

@Tejs, rất tốt. Tôi sẽ cập nhật câu trả lời của tôi để đưa nó vào tài khoản. –

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