Tôi có ứng dụng này sẽ recurse tất cả các thư mục trong một thư mục nhất định và tìm PDF. Nếu một tập tin PDF được tìm thấy, ứng dụng sẽ đếm các trang của nó bằng cách sử dụng ITextSharp. Tôi đã làm điều này bằng cách sử dụng một thread để đệ quy quét tất cả các thư mục cho pdf, sau đó nếu sau đó PDF được tìm thấy, điều này sẽ được xếp hàng đợi vào hồ bơi thread. Mã trông giống như sau:Làm thế nào để biết nếu tất cả các chủ đề của Thread Pool đã được thực hiện với nhiệm vụ của nó?
//spawn a thread to handle the processing of pdf on each folder.
var th = new Thread(() =>
{
pdfDirectories = Directory.GetDirectories(pdfPath);
processDir(pdfDirectories);
});
th.Start();
private void processDir(string[] dirs)
{
foreach (var dir in dirs)
{
pdfFiles = Directory.GetFiles(dir, "*.pdf");
processFiles(pdfFiles);
string[] newdir = Directory.GetDirectories(dir);
processDir(newdir);
}
}
private void processFiles(string[] files)
{
foreach (var pdf in files)
{
ThreadPoolHelper.QueueUserWorkItem(
new { path = pdf },
(data) => { processPDF(data.path); }
);
}
}
Vấn đề của tôi là, làm cách nào để biết người dùng đã hoàn thành việc xử lý tất cả các mục đã được xếp hàng?
Tôi đã thực hiện một logic tương tự như thế này. Chỉ có tôi sử dụng ThreadPool.GetAvailableThreads. Tôi thiết lập các MaxThreads các hồ bơi nên được sử dụng bởi 20. Vì vậy, ở cuối cùng của nhiệm vụ tôi kiểm tra xem các chủ đề có sẵn bằng với tối đa mà tôi đặt. Thật không may điều này không thành công. Tôi sẽ nghiên cứu về Sự kiện đặt lại thủ công đó. –
@mcxiand: Bạn không thể sử dụng bộ đếm ThreadPool vì mã khác (lib) có thể tạo chủ đề và TP đang tái chế/xóa chúng. –
@ Henk Holterman: Vậy sao? Từ những gì tôi hiểu là, ThreadPool sẽ được xếp hàng đợi của nhiệm vụ bằng phương thức QueueUserWorkItem. Bạn có thể cung cấp thêm chi tiết về nhận xét của mình không? nó sẽ được rất nhiều đánh giá cao. –