我有这个应用程序,它将递归给定目录中的所有文件夹并查找 PDF。如果找到 PDF 文件,应用程序将使用 ITextSharp 计算其页数。我通过使用一个线程递归扫描所有文件夹中的 pdf 来做到这一点,然后如果找到 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
中排队的每个工作项给计数器变量加一。
然后当它被处理时,你会减少计数器变量。
确保您通过 Interlocked
上的方法进行递增和递减。类,因为这将确保事情以线程安全的方式完成。
一旦计数器归零,您可以使用 ManualResetEvent
标记任务已完成。
如果您可以访问 .NET 4,那么您可以使用新的 CountdownEvent
类做类似的事情。
关于c# - 如何知道所有线程池的线程是否已经完成了它的任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2490702/