Bên cạnh những khía cạnh mã, trong đó đã được trả lời, bạn cũng cần phải xem xét các khía cạnh I/O của việc truy cập các tập tin.
Lưu ý về kiến trúc và cách tôi đã hoàn thành nhiệm vụ này trong quá khứ - không gợi ý rằng đây là cách tiếp cận phù hợp hoặc nhất thiết phải phù hợp với ứng dụng của bạn. Tuy nhiên, tôi nghĩ rằng các ghi chú của tôi có thể hữu ích cho quá trình suy nghĩ của bạn:
Thiết lập trường ManualResetEvent, gọi nó là ActivateReader hoặc một cái gì đó tương tự, điều này sẽ rõ ràng hơn. Khởi tạo nó là sai.
Thiết lập trường boolean, gọi nó là TerminateReaderThread. Khởi tạo nó như là sai, một lần nữa điều này sẽ trở nên rõ ràng hơn nữa.
Thiết lập trường Queue < chuỗi >, gọi nó là Tệp và khởi tạo.
Chuỗi ứng dụng chính của tôi kiểm tra xem có khóa trên hàng đợi tệp hay không trước khi viết từng đường dẫn tệp có liên quan vào đó. Khi tệp đã được ghi, sự kiện đặt lại bị vấp chỉ báo cho chuỗi trình đọc hàng đợi có các tệp chưa đọc trong hàng đợi.
Sau đó, tôi thiết lập một chuỗi để hoạt động như một trình đọc hàng đợi. Chủ đề này chờ cho ManualResetEvent bị vấp bằng phương thức WaitAny() - đây là một phương thức chặn mà unblocks một khi ManualResetEvent bị vấp. Khi nó bị vấp, chủ đề sẽ kiểm tra xem có tắt máy chủ [bằng cách kiểm tra trường TerminateReaderThread] hay không. Nếu tắt máy đã được khởi động, luồng sẽ tắt một cách duyên dáng, nếu không nó sẽ đọc mục tiếp theo từ hàng đợi và sinh ra một chuỗi công nhân để xử lý tệp. Sau đó tôi khóa hàng đợi trước khi kiểm tra xem có còn vật phẩm nào không. Nếu không có mục nào còn lại, tôi đặt lại ManualResetEvent sẽ tạm dừng luồng của chúng tôi trên lần tiếp theo. Sau đó tôi mở khóa hàng đợi để chủ đề chính có thể tiếp tục viết cho nó. Mỗi trường hợp của chuỗi công nhân cố gắng lấy khóa độc quyền trên tệp được khởi tạo cho đến khi hết thời gian chờ, nếu khóa thành công, nó xử lý tệp, nếu nó không thành công, nó sẽ thử lại khi cần thiết, một ngoại lệ và tự chấm dứt. Trong trường hợp ngoại lệ, luồng có thể thêm tệp vào cuối hàng đợi để một luồng khác có thể lấy lại nó ở một điểm sau. Hãy lưu ý rằng nếu bạn làm điều này, thì bạn cần phải xem xét vòng lặp vô tận mà một vấn đề đọc I/O có thể gây ra. Trong một sự kiện như vậy, một từ điển của các tập tin không thành công với các quầy của bao nhiêu lần họ đã thất bại có thể hữu ích để nếu một số giới hạn đạt được, bạn có thể ngừng thêm lại tập tin vào cuối hàng đợi.
Khi ứng dụng của tôi quyết định chuỗi trình đọc không còn cần thiết nữa, nó sẽ đặt trường TerminateReaderThread thành true. Lần tới chu trình của trình đọc sẽ bắt đầu quá trình của nó, quá trình tắt máy của nó sẽ được kích hoạt.
Cảm ơn tất cả các bạn đã trả lời, tất cả đều tuyệt vời! – Krisc