Nếu tăng dung lượng bộ đệm không đủ và bạn không thể kiểm soát số lượng tệp đang kích hoạt sự kiện tại thời điểm bạn sẽ phải thêm bỏ phiếu bổ sung.
Nó có thể là hấp dẫn để đơn giản là tăng kích thước bộ đệm nhưng điều này nên được thực hiện một cách cẩn thận. Trong thực tế, có một giới hạn 64k khi nói đến truy cập mạng. Lớp FileSystemWatcher
đang sử dụng chức năng Windows API ReadDirectoryChangesW
bên dưới trong đó có giới hạn này:
Nếu bạn muốn nhận được một sự hiểu biết sâu sắc hơn về chi phí của việc sửa đổi kích thước bộ đệm, bạn nên có một cái nhìn tại các bài viết của Walter Wang của Microsoft ở đây:
FileSystemWatcher across the network (đầy đủ bài trích dẫn bên dưới)
Tôi xin lỗi vì tài liệu của FileSystemWatcher.InternalBufferSize không nêu rõ về kích thước bộ đệm khi giám sát mạng đường dẫn. Bạn không nên vượt quá 64K khi giám sát đường dẫn mạng.
FileSystemWatcher về cơ bản là a.Net trình bao bọc cho Win32 API ReadDirectoryChangesW. Để sử dụng ReadDirectoryChangesW, bạn tạo và chỉ định bộ đệm mà Hệ điều hành sẽ điền với các thay đổi. Tuy nhiên, những gì không được đề cập trong tài liệu ReadDirectoryChangesW (nhưng được gợi ý trong docs FileSystemWatcher) là hệ thống tập tin tạo ra một hạt nhân nội đệm để lưu trữ các thông tin thay đổi tạm thời cho đến khi nó có cơ hội để cập nhật bộ đệm người dùng. Kích thước của bộ đệm hạt nhân được tạo ra là cùng kích thước được chỉ định trong ReadDirectoryChangesW và được tạo ra trong bộ nhớ không phân trang gộp. Mỗi lần một FileSystemWatcher/ ReadDirectoryChangesW được tạo/ được gọi, bộ đệm hạt nhân mới cũng được tạo .
Các nhóm bộ nhớ hạt nhân (được phân trang và không phân trang) được đặt sang một bên trong không gian địa chỉ dành cho trình điều khiển thiết bị và các thành phần hạt nhân khác để sử dụng. Họ phát triển và thu nhỏ động như cần thiết. Bạn có thể dễ dàng nhìn thấy kích thước hiện tại của các hồ bơi bằng cách đi tới tab Hiệu suất của Trình quản lý Tác vụ . Các hồ bơi sẽ tăng trưởng động cho đến khi chúng đạt đến giá trị tối đa được tính tại thời điểm khởi động và phụ thuộc vào hệ thống có sẵn tài nguyên (chủ yếu là RAM). Bạn không muốn đạt giá trị tối đa này hoặc khác các dịch vụ và trình điều khiển hệ thống khác nhau sẽ bắt đầu không thành công. Tuy nhiên, điều này giá trị tối đa được tính không phải là dễ dàng có sẵn. Để xác định kích thước hồ bơi tối đa , bạn cần sử dụng trình gỡ lỗi hạt nhân . Nếu bạn quan tâm đến thông tin thêm về hệ thống hồ bơi bộ nhớ, tôi khuyên bạn nên xem Chương 7 trong sách MSPress Bên trong Windows 2000 của Solomon và Russinovich.
Với ý nghĩ này, không có đề xuất về bộ đệm kích thước mà bạn có thể sử dụng. Kích thước hiện tại và tối đa của các hồ bơi hệ thống sẽ là được thay đổi từ khách hàng đến ứng dụng khách. Tuy nhiên, có thể bạn không nên đi trên 64k cho mỗi bộ đệm FileSystemWatcher/ ReadDirectoryChangesW. Điều này bắt nguồn từ thực tế là có giới hạn64k có quyền truy cập mạng là được ghi lại trong ReadDirectoryChangesW. Nhưng cuối cùng, bạn sẽ có để kiểm tra ứng dụng trên nhiều loại của các hệ thống đích được mong đợi để bạn có thể điều chỉnh bộ đệm của bạn.
Có overhead kết hợp với các ứng dụng Net và tôi tưởng tượng rằng một chương trình Win32 ReadDirectoryChangesW có thể có thể đạt được tốt hơn hiệu suất với các kích thước bộ đệm tương tự. Tuy nhiên, với những thay đổi tập tin rất nhanh và nhiều, vượt đệm sẽ không thể tránh khỏi và các nhà phát triển đang diễn ra phải xử lý các trường hợp khi một tràn ngập xảy ra như tay liệt kê các thư mục để phát hiện những thay đổi .
Tóm lại, FileSystemWatcher và ReadDirectoryChangesW là một nhẹ phát hiện sự thay đổi tập tin cơ chế có nghĩa là sẽ có hạn chế của nó. Thay đổi tạp chí là một cơ chế mà chúng tôi sẽ xem xét một giải pháp vừa cân, nhưng vẫn sẽ có những hạn chế:
http://msdn.microsoft.com/en-us/library/aa363798%28VS.85%29.aspx
giải pháp nặng trọng lượng sẽ được viết lái xe một bộ lọc hệ thống tập tin chuyên dụng nằm trong hệ thống tập tin ngăn xếp và giám sát hệ thống tập tin thay đổi. Tất nhiên đây sẽ là cách tiếp cận phức tạp nhất . Hầu hết các máy quét vi-rút , phần mềm sao lưu và tệp các tiện ích giám sát hệ thống như filemon (www.sysinternals.com) thực hiện trình điều khiển bộ lọc.
Tôi hy vọng giải thích ở trên sẽ giúp bạn hiểu nguyên nhân gốc của sự cố bạn đang gặp phải. Vui lòng trả lời cho chúng tôi biết bạn có cần thông tin thêm hay không. Cảm ơn bạn.
Chỉ cần một bổ sung nhỏ: kích thước bộ đệm mặc định là 8192. –