我有这个应用程序将recurse在给定的目录中的所有文件夹,并寻找PDF。如果找到PDF文件,应用程序将使用ITextSharp对其页面进行计数。我通过使用线程递归扫描所有文件夹来执行此操作,然后如果找到了PDF,则会将其排入线程池。代码如下所示:如何知道所有线程池的线程是否已完成其任务?
//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); }
);
}
}
我的问题是,我怎么知道该线程池中的线程处理完所有排队的项目,所以我可以告诉应用程序与其预期完成任务的用户?
我对此做了类似的逻辑。只有我使用了ThreadPool.GetAvailableThreads。我设置了池应该使用的MaxThreads。因此,在最后一项任务中,我检查了可用线程是否等于我设置的最大值。不幸的是,这失败我将研究该手动重置事件。 – 2010-03-22 09:23:36
@mcxiand:你不能使用ThreadPool计数器,因为其他代码(lib)可以创建线程并且TP正在回收/删除它们。 – 2010-03-22 09:26:59
@亨克霍尔特曼:是吗?从我理解的是,ThreadPool将由QueueUserWorkItem方法排队等待任务。你能否提供更多关于你评论的细节?这将非常感激。 – 2010-03-22 09:47:14